【发布时间】:2009-04-16 17:37:07
【问题描述】:
假设我有一个 DataGridView(名为 dataGridView),它正在显示一个强类型 DataTable(名为 ChildDataTable)。
dataGridView 有一个 DataGridViewCheckBoxColumn(名为 parentIDColumn),它绑定到每个 ChildDataRow 上的字段属性 ParentID em> 在 ChildDataTable 中。
ParentID 是一个外键,它将 ChildDataTable 与 DataSet 中的另一个 DataTable(创造性地命名为 ParentDataTable)相关联。在这种情况下,一个孩子可能只有一个父母。 ParentID(以及相关的ParentDataTable.ID)字段的类型为Guid。
ChildDataTable.ParentID 允许空值。空值表示子级与任何父级“断开连接”,我希望它在 dataGridView 列中显示为未选中的CheckBox 列 parentIDColumn(标记为“有父”用于澄清目的)。
我尝试通过创建实现相等和比较操作的自定义类型来操作 parentIDColumn 上的 TrueValue 和 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 逻辑,以便选中表示外键不为空,未选中表示外键为空?
【问题讨论】:
标签: c# winforms datagridview datarelation datagridviewcheckboxcell