0

내가 강력하게 형식화 된 DataTable (이름 ChildDataTable)를 표시하는 DataGridView (이름 DataGridView에)가 말한다.DataRelation 상태를 표시하기 위해 DataGridViewCheckBoxColumn을 얻는 방법은 무엇입니까?

DataGridView에 ChildDataTable 는 각 ChildDataRow에 필드 속성 ParentID 바인딩 된 DataGridViewCheckBoxColumn (라는 parentIDColumn)을 갖는다.

ParentID은 (창조적 ParentDataTable명명)를 DataSet 다른 DataTableChildDataTable 관한 외래 키이다. 이 경우, 자녀는 오직 한 명의 부모만을 가질 수 있습니다. 부모 ID (및 관련된 ParentDataTable.ID) 필드의 유형은 Guid입니다.

ChildDataTable.ParentID은 null을 허용합니다. null 값은 자식이 부모로부터 "연결이 끊어졌습니다"는 것을 나타내며 dataGridViewCheckBoxparentIDColumn (명확하게하기 위해 레이블이 붙어 있음)에 표시하려고합니다.

나는 평등과 비교 작업을 구현하는 사용자 정의 유형을 만들어 parentIDColumnTrueValueFalseValue 속성을 조작 시도 : 에 참/거짓 값로 설정 한 후

public class NotDBNull : IComparable 
    { 
     public override bool Equals(object obj) 
     { 
      return !obj.Equals(DBNull.Value); 
     } 

     public override int GetHashCode() 
     { 
      return Guid.Empty.GetHashCode(); 
     } 

     public int CompareTo(object obj) 
     { 
      return Equals(obj) ? 0 : 1; 
     } 
    } 

    public class IsDBNull : IComparable 
    { 
     public override bool Equals(object obj) 
     { 
      return obj.Equals(DBNull.Value); 
     } 

     public override int GetHashCode() 
     { 
      return DBNull.Value.GetHashCode(); 
     } 

     public int CompareTo(object obj) 
     { 
      return Equals(obj) ? 0 : 1; 
     } 
    } 

를 ... 그리고 parentIDColumn :

 parentIDColumn.TrueValue = new NotDBNull(); 
     parentIDColumn.FalseValue = new IsDBNull(); 

그러나 디버거 내가 가진 것을 제안, 내 중단 점에 도달하지 배를 놓 쳤어. 나는 DataGridView에의 디스플레이에 다음과 같은 오류가 발생합니다 :

--------------------------- 
DataGridView Default Error Dialog 
--------------------------- 
The following exception occurred in the DataGridView: 

System.FormatException: Value '39df7d96-941a-4be9-a883-03182363bbab' cannot be converted to type 'Boolean'. 
    at System.Windows.Forms.Formatter.FormatObjectInternal(Object value, Type targetType, TypeConverter sourceConverter, TypeConverter targetConverter, String formatString, IFormatProvider formatInfo, Object formattedNullValue) 
    at System.Windows.Forms.Formatter.FormatObject(Object value, Type targetType, TypeConverter sourceConverter, TypeConverter targetConverter, String formatString, IFormatProvider formatInfo, Object formattedNullValue, Object dataSourceNullValue) 
    at System.Windows.Forms.DataGridViewCell.GetFormattedValue(Object value, Int32 rowIndex, DataGridViewCellStyle& cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context) 

To replace this default dialog please handle the DataError event. 
--------------------------- 
OK 
--------------------------- 

그래서 나는 나의 정의에 도달하기되지 않았 음을 알 수 있습니다. 형식 호출은 셀 수준 (열보다는)에서 발생하는 것으로 보이므로 누락 된 더 나은/다른 방법이 있는지 확실하지 않았습니다.

체크 박스 열에 내 True/False 논리를 삽입하면 외래 키가 null이 아니며 선택되지 않았 음을 의미합니다.

답변

1

조금만했지만 지금은 해결할 수있는 해결책이 있습니다.

난 발현 "ParentID가 NULL"을 사용 부울 타입이었다 ChildDataTable 새 계산 열 ( 라는 HasParent)를 첨가. 일단 parentIDColumn에 바인딩되면 완벽하게 작동합니다.

관련 문제