強い型( ChildDataTable)を表示しているDataGridView
(dataGridViewという名前の)があるとします。DataTable
dataGridViewには、ChildDataTableの各ChildDataRowのフィールドプロパティParentIDにバインドされた( parentIDColumnという名前の)がDataGridViewCheckBoxColumn
あります。
ParentIDは、ChildDataTableを(作成的に名前が付けられたParentDataTableDataTable
)内の別のキーに関連付ける外部キーです。この場合、子には親が1人しかいない可能性があります。ParentID(および関連するParentDataTable.ID)フィールドのタイプはです。DataSet
Guid
ChildDataTable.ParentIDはnullを許可します。null値は、子がどの親からも「切断」されていることを表します。これをdataGridViewに、チェックCheckBox
されていない列parentIDColumn(わかりやすくするために「HasParent」というラベルが付いています)として表示します。
等式および比較操作を実装するカスタムタイプを作成して、 parentIDColumnTrueValue
のプロパティとFalseValue
プロパティを操作してみました。
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のTrue / False値として設定します:
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でないことを意味し、チェックされていない場合はnullでないことを意味するようにするにはどうすればよいですか?