0

Sagen, ich habe einen DataGridView (benannt Datagridview), die einen stark typisierten DataTable (benannt ChildDataTable) angezeigt wird.Wie erhält man eine DataGridViewCheckBoxColumn, um den DataRelation-Status anzuzeigen?

Datagridview hat eine DataGridViewCheckBoxColumn (benannt parentIDColumn), die auf einem Feld Eigenschaft ParentID auf jeder ChildDataRow in ChildDataTable gebunden ist.

ParentID ist ein Fremdschlüssel, ChildDataTable zu einem anderen in der DataTableDataSet (kreativ genannt ParentDataTable) bezieht. In diesem Fall kann ein Kind nur einen Elternteil haben. ParentID (und das zugehörige ParentDataTable.ID) Feld sind vom Typ Guid.

ChildDataTable.ParentID ermöglicht Nullen. Ein Nullwert bedeutet, dass das Kind von einem Elternteil "getrennt" ist, und ich möchte dies in dataGridView als ein unmarkiertes CheckBox in Spalte parentIDColumn (zur Verdeutlichung mit "Has Parent" gekennzeichnet) anzeigen.

Ich habe versucht, die TrueValue und FalseValue Eigenschaften auf Manipulation parentIDColumn durch benutzerdefinierte Typen erstellen, die Gleichheit und Vergleichsoperationen implementieren:

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; 
     } 
    } 

... und dann sie als die Wahr/Falsch-Werte auf Einstellung parentIDColumn:

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

Aber der Debugger trifft nie meinen Haltepunkt, was darauf hindeutet, dass ich verpasste das Boot. Ich erhalte die folgenden Fehler bei der Anzeige von 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 
--------------------------- 

Also ich weiß, dass meine Anpassung nicht erreicht zu werden. Der Aufruf des Formats scheint auf einer Zellenebene (statt einer Spalte) zu erfolgen, so dass ich nicht sicher war, ob es eine bessere/andere Art gab, die mir fehlte.

Wie injiziere ich meine True/False-Logik für die Checkbox-Spalte, so dass überprüft, dass der Fremdschlüssel nicht null ist, und nicht aktiviert bedeutet, dass es?

Antwort

1

Nahm ein bisschen, aber ich habe jetzt eine praktikable Lösung.

Ich habe eine neue berechnete Spalte (genannt HasParent) zu ChildDataTable, die die Expression verwendet "ParentID IS NOT NULL" und war einer Booleschen Typ. Einmal an parentIDColumn gebunden, funktionierte das perfekt.

Verwandte Themen