0

MySQL DB から入力された DataGridView があり、ボタンをクリックすると、特定の列の重複を強調表示してテーブルを検証したいと考えています。

これを行う最善の方法は何ですか。フィールドはデータベースの主キーではなく、複製しても問題ありませんが、これが事実であることを明らかにする必要がありますか?

4

2 に答える 2

1

#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 イベントを調べると解決する可能性があります。

于 2013-04-11T15:34:52.883 に答える
0

強調表示する列でDataGridViewを並べ替えてから、各行をループします。列の値が前の値と同じである場合は、ハイライトを適用します。

凝ったものにしたい場合は、データソース(おそらくDataTableですが、他の何かである可能性があります)に対してLINQクエリを記述し、目的の列でグループ化し、各グループのインスタンスの数をカウントし、次の値のみを選択します。 1より大きいカウント。次に、それをルックアップとして使用するか、データソースに結合して、重複する値を持つ行を「マーク」することができます。ハイライトを適用するには、この新しいフィールドをチェックしてから、それに応じてハイライトを適用する必要があります。

サンプルコードを作成する時間はありませんが、それほど難しくはありません。

編集

  1. DataGridView.Sortを使用して並べ替えを適用します。
  2. Rowsコレクション を繰り返し処理します。
    1. 現在の行が最初の行()の場合は、スキップしますIndex= 0
    2. それ以外の場合は、 Cells [ columnName ]から目的の列の値を取得します。現在の行と前の行の値。
    3. それらを比較します。同じ場合は、背景色などのスタイルを適用します。
于 2013-03-20T16:31:33.247 に答える