2012-05-20 111 views
4

我需要使用DevExpress ASPxGridView。我有一個數據源對象,它返回兩列重要性,ObjectType和ObjectID。 ObjectType可以是患者或醫師。 ObjectID是一個給出患者或醫師ID的int值。希望這是有道理的。 ObjectID由Patient表或Physician表選擇,它們是分隔表,所以我無法以任何方式加入它們。如何以編程方式在ASpxGridView中選擇ASPxComboBox中的值

表結構看起來像這樣:

對象表:對象類型的varchar( 「醫師」 或 「患者」),的ObjectID INT

狗表ID INT,名稱爲varchar

貓表ID int,Name varchar

我已經能夠使用兩個控件cbPatient和cbPhysician通過組合框編寫相應的objectType,並通過數據源填充了兩個控件cbPatient和cbPhysician。

我無法弄清楚的是,當我編輯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> 

回答

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

首先,你應該使用哪一個會火的時候,數據是有界到GridView,將代碼放在它的GridView_RowDataBoundEvent。 其次,要能設置在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; 
+0

好猜,但是這是當網格editted產生.aspx的組合框。所以這不是一個下拉列表。查看新的ASPX代碼。我很難確定何時生成控件,以及如何實際訪問控件。 – Rob

相關問題