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

Asp.net 如何以编程方式在ASpxGridView的ASPxComboBox中选择值,asp.net,aspxgridview,Asp.net,Aspxgridview,我需要使用DevExpress ASPxGridView。我有一个datasource对象,它返回两列重要信息:ObjectType和ObjectID。对象类型可以是患者或医生。ObjectID是一个int值,表示患者或医生的ID。希望这是有道理的。ObjectID由患者表或医生表选择,它们是独立的表,因此我无法以任何方式加入它们 表结构如下所示: 对象表:ObjectType varchar(“医生”或“患者”),ObjectID int Dogs表ID int,Name varchar Ca

我需要使用DevExpress ASPxGridView。我有一个datasource对象,它返回两列重要信息:ObjectType和ObjectID。对象类型可以是患者或医生。ObjectID是一个int值,表示患者或医生的ID。希望这是有道理的。ObjectID由患者表或医生表选择,它们是独立的表,因此我无法以任何方式加入它们

表结构如下所示:

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

Dogs表ID int,Name varchar

Cats表ID int,名称varchar

我已经能够通过一个组合框编写适当的objectType,并通过使用两个控件来编写ObjectID,即cbPatient和CBMedical,这两个控件由数据源填充

我不明白的是,当我编辑ASPxGridView时,如何在cbPatient或cbmedical中显示对象值。例如,如果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>

首先,您应该使用GridView\u RowDataBoundEvent,当数据绑定到GridView时将触发该事件,将代码放入其中。 其次,为了能够在组合框中设置值,您应该执行以下操作:

//Ensure that the Dropdownlist dosn't have any value selected, otherwise it will give  an exception
DropDownList_Country.ClearSelection();
//You can use either FindByValue or FindByText
DropDownList_Country.Items.FindByValue("").Selected = true;

我最终发现,combobox在数据绑定后触发一个数据绑定事件,该事件发生在RowEditing事件(或任何它被调用的事件)之后。我找到的最好的解决方案就是这个代码。也许有一个更优雅的解决方案,但这是可行的。session变量用于避免在执行行更新时触发代码(是的,它也会触发,不要问我为什么)

在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>

猜得不错,但这是一个在编辑网格时生成的Aspx组合框。所以它不是一个下拉列表。请参阅新的ASPX代码。我很难弄清楚该控件是何时生成的,以及如何实际访问该控件。
<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>