2009-08-10 5 views
1

DataSource가 개체에 연결된 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); 
     } 
}