2009-08-10 166 views
1

我有一個DataSourceView連接到對象的DataGridView。一切工作正常(我可以編輯該對象,並且更改被保留),直到我想選擇使用組合框連接的對象(在數據庫中它通過外鍵連接)。從其他表/對象中選擇列

我可以填充組合框,以便顯示正確的值(即用戶名)。我通過選擇該特定列的數據源來完成此操作。它允許我選擇顯示的屬性和值(但我不能將值設置爲整個選擇的對象)。但是,當對象正在保存時,會發生錯誤。 DataGridView試圖保存所選對象(此「外部對象」的屬性)的值,但不保存對象本身。

我該如何說服DataGridView保存選定的對象,而不僅僅是它的一個屬性?

回答

1

這是常見問題之一。你不能用原始的DataGridViewComboboxColumn做到這一點。我前一段時間找到了一個解決方案 - 你必須繼承它。代碼如下:

public class DataGridViewBusinessComboBoxColumn : DataGridViewComboBoxColumn 
    { 
     public DataGridViewBusinessComboBoxColumn() 
     { 
      CellTemplate = new DataGridViewBusinessComboBoxCell(); 
     } 
    } 

    public class DataGridViewBusinessComboBoxCell : DataGridViewComboBoxCell 
    { 
     private System.ComponentModel.PropertyDescriptor displayProp; 

     private CurrencyManager ListManager 
     { 
      get 
      { 
       BindingMemberInfo bmi = new BindingMemberInfo(base.DisplayMember); 
       if (DataGridView != null) 
       { 
        return (CurrencyManager) 
          DataGridView.BindingContext[DataSource, bmi.BindingPath]; 
       } 
       return null; 
      } 
     } 

     private System.ComponentModel.PropertyDescriptor DisplayProp 
     { 
      get 
      { 
       if (displayProp == null) 
       { 
        displayProp = ListManager.GetItemProperties().Find(DisplayMember, 
                     true); 
       } 
       return displayProp; 
      } 
     } 

     protected override object GetFormattedValue(object value, int rowIndex, 
                ref DataGridViewCellStyle cellStyle, 
                TypeConverter valueTypeConverter, 
                TypeConverter formattedValueTypeConverter, 
                DataGridViewDataErrorContexts 
                 context) 
     { 
      if (value == null || value == cellStyle.DataSourceNullValue) 
       return ""; 

      return base.GetFormattedValue(DisplayProp.GetValue(value), 
              rowIndex, ref cellStyle, valueTypeConverter, 
              formattedValueTypeConverter, context); 
     } 

     public override object ParseFormattedValue(object formattedValue, 
                DataGridViewCellStyle cellStyle, 
                TypeConverter formattedValueTypeConverter, 
                TypeConverter valueTypeConverter) 
     { 
      foreach (object item in ListManager.List) 
      { 
       if ((string) DisplayProp.GetValue(item) == (string) formattedValue) 
        return item; 
      } 

      return base.ParseFormattedValue(formattedValue, cellStyle, 
              formattedValueTypeConverter, valueTypeConverter); 
     } 
}