vb.netおよびc#の悪意のある「無効なDataGridViewComboBoxCell」

みなさん、こんにちは。MSVSのプログラミングウィンドウです。



問題



1. DataGridViewがあり、列の1つはDataGridViewComboBoxColumnです。

2.データは、DataTableのようにDataSourceを介してグリッドにスローされます(行ごとではなく、これは重要です)。

3. ComboBoxColumnのデータもバインドされ、データソースには1行ずつ入力されたDataMemberがあります。問題ではなく、特定のデータ構造も重要ではありません。その中のValueMemberは、整数、長さ、または文字列です。



ドロップダウンリストから何かを選択すると、dgv_DataErrorがエラー「InvalidDataGridViewComboBoxCellvalue」をキャッチします。そして、満たすと-彼女。



探す



グーグルはたった2.5ページのフォーラムを配った。これは、問題が広範囲に及ぶことを意味しますが、中間レベルでは解決できません。思考の展開の間違った方向:

a)データをバインドした後、各行を調べ、ハンドルを使用してセル内の値を再割り当てし、リスト内で見つけます。

b)dgv_DataError処理を停止します。



同時に、Rows.Add()を使用してテーブルの行を手動で入力すると、すべて問題ありません。



残念ながら、私の同僚はリストの何が問題なのかを突き止めようとしましたが、問題はリストではなく、タイプの不一致にありました。



これまで、MS SQLは、IDが有効になっている列に10進数を使用していました。はい、それは10進(18,0)ですが、それでもフラクショナルデータタイプのままです。同意します。インデックスの小数点以下の桁数を確認すると常に便利です。年間最大100万レコードを期待する場合、10年間は​​10進数(7.0)で十分であり、10000年間は10進数(10.0)で十分です。太陽が50億年で爆発するとします。数字を数えましょう:6 + 9、つまり10進数(15.0)で十分であり、デフォルトの18-マージンあり。



そしてリストには、整数、長い、さらには文字列があります!



私たちは線をペンで埋めます。鉄のブロックヘッドは、私たちのためにすべてを部分的および非部分的に暗黙的に変換します。遅くて信頼できる。そして、私たちはそれを速くしたいのですが、不必要なタイプチェックと変換がないことを含めて節約が達成されます。



その結果、2つの問題が発生します

。1。データをテーブルにロードすると、リストの見出し名ではなく、データベースのIDが列に表示されます。

2.ドロップダウンリストからヘッダー名を選択しても、セルの値は更新されません。



決定



データベースが非常に大きい、非常に大きい、古い、またはインターフェイス開発者が利用できない場合は、コンボボックスで10進インデックスを使用します。



データベース内のテーブルの構造を変更する方が簡単な場合は、外部キーにbigintを使用することをお勧めします。これは、10進数(18,0)よりもほぼ全体ビット大きく、高速です。



All Articles