0

強い型( ChildDataTable)を表示しているDataGridView(dataGridViewという名前)があるとします。DataTable

dataGridViewには、ChildDataTableの各ChildDataRowのフィールドプロパティParentIDにバインドされた parentIDColumnという名前の)DataGridViewCheckBoxColumnあります

ParentIDは、ChildDataTableを(作成的に名前が付けられたParentDataTableDataTable )内の別のキーに関連付ける外部キーです。この場合、子には親が1人しかいない可能性があります。ParentID(および関連するParentDataTable.ID)フィールドのタイプはです。DataSetGuid

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でないことを意味するようにするにはどうすればよいですか?

4

1 に答える 1

1

少し時間がかかりましたが、今では実行可能な解決策があります。

「ParentID IS NOT NULL」という式を使用し、ブール型の新しい計算列 ( HasParentという名前) をChildDataTableに追加しました。parentIDColumnにバインドすると、これは完全に機能しました。

于 2009-04-16T20:39:19.337 に答える