Допустим, у меня есть DataGridView
(с именем dataGridView ), который отображает строго типизированный DataTable
(с именем ChildDataTable ).
dataGridView имеет DataGridViewCheckBoxColumn
(с именем parentIDColumn ), который связан со свойством поля ParentID для каждого ChildDataRow в ChildDataTable .
ParentID - это внешний ключ, который связывает ChildDataTable с другим DataTable
в DataSet
(с творческим именем ParentDataTable ). В этом случае у ребенка может быть только один родитель. ParentID (и связанное с ним поле ParentDataTable.ID ) имеют тип Guid
.
ChildDataTable.ParentID разрешает нулевые значения. Нулевое значение означает, что дочерний элемент «отключен» от любого родителя, и я хочу, чтобы это отображалось в dataGridView как непроверенное CheckBox
в столбце parentIDColumn (с пометкой «Имеет родителя») для уточнения).
Я пытался манипулировать свойствами TrueValue
и FalseValue
в parentIDColumn , создавая пользовательские типы, реализующие операции равенства и сравнения:
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;
}
}
... и затем установите их в качестве значений True / False для 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, а флажок снят, значит, он есть?