gpt4 book ai didi

asp.net - 如何以编程方式选择 ASpxGridView 中 ASPxComboBox 中的值

转载 作者:行者123 更新时间:2023-12-02 18:07:32 29 4
gpt4 key购买 nike

我需要使用 DevExpress ASPxGridView。我有一个数据源对象,它返回两列重要的对象:ObjectType 和 ObjectID。对象类型可以是患者或医生。 ObjectID 是一个 int 值,给出患者或医生的 ID。希望这是有道理的。 ObjectID 由 Patient 表或 Physician 表选择,它们是缩进表,因此我无法以任何方式连接它们。

表结构如下所示:

对象表:ObjectType varchar(“医生”或“患者”),ObjectID int

狗表 ID int,名称 varchar

Cats 表 ID int,名称 varchar

我已经能够通过组合框编写适当的对象类型,并使用两个由数据源填充的控件 cbPatient 和 cbPhysician 编写 ObjectID。

我不明白的是,当我编辑 ASPxGridView 时,如何在 cbPatient 或 cbPhysician 中显示对象值。例如,如果 ObjectType 是 Cats 并且 ObjectID 是 1,那么我想在 cbCats 中显示与 ID 1 对应的名称。

这就是代码的样子。现在,无论出于何种原因,在某些情况下,所选值有时会变为空白。我不确定在什么事件中运行此代码。

protected void grid_HtmlRowCreated(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewTableRowEventArgs e)
{
if (e.RowType != DevExpress.Web.ASPxGridView.GridViewRowType.EditForm) return;
if (grid.IsNewRowEditing || grid.IsEditing)
{
int val = (int)grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID" );

ASPxComboBox cbPatient = ((ASPxComboBox)grid.FindEditRowCellTemplateControl(grid.Columns["PatientID"] as GridViewDataComboBoxColumn, "cbPatient"));
if (val != 0)
{
string objectID = grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID").ToString();

if (cbPatient.Items.Count > 0)
{
cbPatient.Items[1].Selected = true;
}
else
{
cbPatient.DataSource = dsPatName;
cbPatient.DataBindItems();
if (cbPatient.Items.Count > 0)
cbPatient.Items[1].Selected = true;
}

}
}

}

这是 ASPX 代码。

</dx:GridViewDataComboBoxColumn>
<dx:GridViewDataComboBoxColumn Caption="Patient Name" FieldName="PatientID" Name="PatName" Visible="false">
<PropertiesComboBox TextField="Name" ValueField="ID" ValueType="System.Int32"></PropertiesComboBox>
<EditItemTemplate>
<dx:ASPxComboBox ID="cbPatient" runat="server" TextField="Name" ValueField="ID"
Value='<%# Bind("PatientID") %>' AutoPostBack="false" ValueType="System.Int32" > </dx:ASPxComboBox>
</EditItemTemplate>
</dx:GridViewDataComboBoxColumn>

最佳答案

我终于发现组合框在数据绑定(bind)后触发 DataBound 事件,该事件发生在 RowEditting 事件(或任何名称的事件)之后。我发现的最好的解决方案是这段代码。也许有一个更优雅的解决方案,但这可行。 session 变量的存在是为了避免在进行行更新时触发代码(是的,它也会触发,不要问我为什么)。

protected void cbPatient_DataBound(object sender, EventArgs e)
{
object rightsindex = grid.GetRowValues(grid.EditingRowVisibleIndex, "Rights");
if (rightsindex == null) return;
int rights = Int32.Parse(grid.GetRowValues(grid.EditingRowVisibleIndex, "Rights").ToString());
object objectID = grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID");

ASPxComboBox cbPatient = ((ASPxComboBox)grid.FindEditRowCellTemplateControl(grid.Columns["PatientID"] as GridViewDataComboBoxColumn, "cbPatient"));
if (cbPatient != null && cbPatient.Items.Count > 1)
{

if (rights == 8)
{
ListEditItem pt = cbPatient.Items.FindByValue(objectID);
if (pt != null && Session["PatientID"] == null)
{
cbPatient.Items[pt.Index].Selected = true;
Session["PatientID"] = (Int32)pt.Value;

}
}
//cbPatient.Items[1].Selected = true;
}
}

在 ASP.NET 中

<dx:GridViewDataComboBoxColumn Caption="Patient Name" FieldName="PatientID"  Name="PatName"  Visible="false">
<PropertiesComboBox DataSourceID="dsPatName" TextField="Name" ValueField="ID" ValueType="System.Int32">
</PropertiesComboBox>
<EditItemTemplate>
<dx:ASPxComboBox ID="cbPatient" runat="server" DataSourceID="dsPatName" TextField="Name" ValueField="ID"
Value='<%# Bind("PatientID") %>' AutoPostBack="false" ValueType="System.Int32" ondatabound="cbPatient_DataBound" > </dx:ASPxComboBox>
</EditItemTemplate>
</dx:GridViewDataComboBoxColumn>

关于asp.net - 如何以编程方式选择 ASpxGridView 中 ASPxComboBox 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674595/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com