Скажем, у меня есть DataGridView
(названный DataGridView), который отображающее сильно типизированных DataTable
(названный ChildDataTable).Как получить DataGridViewCheckBoxColumn, чтобы показать статус DataRelation?
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 для столбца флажка, так что checked означает, что внешний ключ не равен null, а unchecked означает, что это так?