0

我有一个从 MySQL DB 填充的 DataGridView,单击一个按钮,我希望通过突出显示特定列中的重复项来验证表。

做这个的最好方式是什么。该字段不是数据库中的主键,可以复制,但是只需要明确是这种情况吗?

4

2 回答 2

1

这将是#Cyborgx37 建议的一种方法

    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 名称然后使用列索引调用 sub。例如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 回答