3

私は、シーケンスを格納する 2 つの列を持つ DataTable にバインドされた DataGrid を持っています。私の DataGrid では、これらのシーケンス列は DataGridViewComboBoxes にバインドされています。ユーザーは ComboBoxes からシーケンスを設定できます。シーケンス列のデフォルト値は 0 です。

ボタンのクリック時に両方の列で重複を確認したいだけです。ユーザーは両方の列で重複する値を選択できないはずです。

DataView の ToTable メソッドを使用して個別の値を見つけることで実装すると、値が「0」の行も取得されます

DataTable の列に一意の制約を実装すると、0 もチェックされます。

値を 0 で削除しようとすると、DataGrid が DataTable にバインドされているため、DataGrid も変更されます

既存の dataTable から新しい DataTable を宣言しようとすると、DataGrid にも自動的にバインドされます。

私を助けてください。

4

1 に答える 1

2

以下は、DataTable 内の重複値をチェックする方法の例です。

Option Strict On

Module Module1
  Sub Main()
    Dim dt As New DataTable
    dt.Columns.Add("mycolumn", GetType(Integer))
    dt.Rows.Add({"1"})
    dt.Rows.Add({"2"})
    dt.Rows.Add({"2"})
    dt.Rows.Add({"4"})
    dt.Rows.Add({"7"})
    Dim duplicateDictionary As New Dictionary(Of Integer, Integer) 'value, count

    For Each row As DataRow In dt.Rows
      Dim count As Integer = 0
      Dim value As Integer = CInt(row("mycolumn"))
      duplicateDictionary.TryGetValue(value, count)
      duplicateDictionary(value) = count + 1
    Next

    For Each kv As KeyValuePair(Of Integer, Integer) In duplicateDictionary
      If kv.Value > 1 Then 'we have a duplicate
        Debug.WriteLine("{0} is a duplicated value, encountered {1} times", kv.Key, kv.Value)
      End If
    Next
  End Sub
End Module

UniqueConstraint を追加することも可能ですが、編集の仕方によっては邪魔になりすぎることがあります。グリッド内で直接編集する場合、ユーザーが無効なレコードをメモリに保存し、制約違反の例外ではなく検証エラーを表示してエラーを修正できるようにすることができます。もちろん、無効なデータをデータベースに保存することはありません。

于 2013-06-14T13:31:16.443 に答える