我需要使用DevExpress ASPxGridView。我有一个数据源对象,它返回两个重要的列,ObjectType和ObjectID。 ObjectType可以是患者或医生。 ObjectID是一个int值,给出患者或医师的ID。希望这是有道理的。 ObjectID由Patient表或Physician表选择,它们是indendent表,因此我无法以任何方式加入它们。
表结构如下所示:
对象表:ObjectType varchar(“Physician”或“Patient”),ObjectID int
Dogs Table ID int,Name varchar
Cats table ID int,Name varchar
我能够通过组合框编写适当的objectType,使用两个控件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>
答案 0 :(得分:2)
我终于发现组合框在数据绑定之后触发了一个DataBound事件,该事件发生在RowEditting事件之后(或者它被调用的任何事件)。我发现的最佳解决方案是此代码。也许有一个更优雅的解决方案,但这是有效的。会话变量是为了避免在执行行更新时触发代码(是的,它也会触发,不要问我为什么)。
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>
答案 1 :(得分:0)
首先,你应该使用GridView_RowDataBoundEvent,它将数据绑定到gridview时触发,将你的代码放入其中。 其次,为了能够在ComboBox中设置值,您应该执行以下操作:
//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;