MySQL DB から入力された DataGridView があり、ボタンをクリックすると、特定の列の重複を強調表示してテーブルを検証したいと考えています。
これを行う最善の方法は何ですか。フィールドはデータベースの主キーではなく、複製しても問題ありませんが、これが事実であることを明らかにする必要がありますか?
MySQL DB から入力された DataGridView があり、ボタンをクリックすると、特定の列の重複を強調表示してテーブルを検証したいと考えています。
これを行う最善の方法は何ですか。フィールドはデータベースの主キーではなく、複製しても問題ありませんが、これが事実であることを明らかにする必要がありますか?
#Cyborgx37 で提案されているように、これはそれを行う 1 つの方法です。
Sub HighlightDupes(ByRef dgv As DataGridView, ByVal col_id As Integer)
Dim dgvCol As DataGridViewColumn = dgv.Columns(col_id)
dgv.Sort(dgvCol, System.ComponentModel.ListSortDirection.Ascending)
Dim numRows As Integer = dgv.Rows.Count() ''// or dgv.SelectedRows.Count() for the selected rows
Dim flagFirstRow As Boolean = True
Dim tempStr As String = ""
For Each RW As DataGridViewRow In dgv.Rows ''// or dgv.SelectedRows for the selected rows
On Error Resume Next
If Not (flagFirstRow) Then
If (RW.Cells(col_id).Value.ToString() = tempStr) Then
''// RW.Cells(col_id).Style.BackColor = Color.LightGreen
''// RW.Cells(col_id).Style.BackColor = Color.White
RW.Cells(col_id).Selected = True
dgv.CurrentCell.Style.BackColor = Color.LightGreen
dgv.CurrentCell.Style.ForeColor = Color.White
MsgBox("Dupe found: " & tempStr)
End If
End If
tempStr = RW.Cells(col_id).Value.ToString()
flagFirstRow = False
Next
End Sub
.
datagridview 名、次に列インデックスを使用してサブを呼び出します。たとえばHighlightDupes(DataGridView1, 0)
、これは最初の列をソートし、重複を見つけます。
並べ替えのためにセルの書式設定が正しく機能するかどうかはわかりません。配列を埋めてからソートし、その複製を見つけてからdgvをループし、ソートされていないときにセルのフォーマットを設定する方が良いかもしれません。または、dgv のrowprepaint イベントを調べると解決する可能性があります。
強調表示する列でDataGridViewを並べ替えてから、各行をループします。列の値が前の値と同じである場合は、ハイライトを適用します。
凝ったものにしたい場合は、データソース(おそらくDataTableですが、他の何かである可能性があります)に対してLINQクエリを記述し、目的の列でグループ化し、各グループのインスタンスの数をカウントし、次の値のみを選択します。 1より大きいカウント。次に、それをルックアップとして使用するか、データソースに結合して、重複する値を持つ行を「マーク」することができます。ハイライトを適用するには、この新しいフィールドをチェックしてから、それに応じてハイライトを適用する必要があります。
サンプルコードを作成する時間はありませんが、それほど難しくはありません。
編集
Index
= 0