如何让DataGridViewCheckBoxColumn显示DataRelation状态?

时间:2009-04-16 17:37:07

标签: c# winforms datagridview datarelation datagridviewcheckboxcell

假设我有DataGridView(名为 dataGridView ),显示强类型DataTable(名为 ChildDataTable )。

dataGridView 有一个DataGridViewCheckBoxColumn(名为 parentIDColumn ),它绑定到每个 ChildDataRow上的字段属性 ParentID ChildDataTable 中的

ParentID 是一个外键,它将 ChildDataTable DataTable中另一个DataSet相关联(创造性地命名为 ParentDataTable )。在这种情况下,孩子可能只有一个父母。 ParentID (以及相关的 ParentDataTable.ID )字段属于Guid类型。

ChildDataTable.ParentID 允许空值。 null值表示子项与任何父项“断开连接”,我希望它在 dataGridView 中显示为 parentIDColumn 列中未经检查的CheckBox(标记为“有父母”是为了澄清目的)。

我尝试通过创建实现相等和比较操作的自定义类型来操纵 parentIDColumn 上的TrueValueFalseValue属性:

    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逻辑,以便选中表示外键不为空,未选中表示是否为?

1 个答案:

答案 0 :(得分:1)

采取了一些措施,但我现在有了一个可行的解决方案。

我向 ChildDataTable 添加了一个新的计算列(名为 HasParent ),该列使用了表达式“ParentID IS NOT NULL”并且是布尔类型。一旦绑定到 parentIDColumn ,这就完美无缺。