突出显示DataGridView VB.NET中的任何重复项

时间:2013-03-20 16:22:16

标签: .net vb.net winforms vb.net-2010

我有一个从MySQL数据库中填充的DataGridView,点击一个按钮我想通过突出显示特定列中的重复项来验证表。

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

2 个答案:

答案 0 :(得分:0)

按要突出显示的列对DataGridView进行排序,然后遍历每一行。如果列值与先前值相同,请应用突出显示。

如果你想得到想象,你可以针对你的数据源编写一个LINQ查询(可能是一个DataTable,但也可能是其他的),按所需列分组,计算每个组中的实例数,然后只选择计数大于1的那些值。然后,您可以将其用作查找或将其连接回数据源,以“标记”具有重复值的行。应用突出显示需要检查此新字段,然后相应地应用突出显示。

没有时间制作一些示例代码,但这不应该太难。

修改

  1. 使用DataGridView.Sort
  2. 进行排序
  3. Rows集合进行迭代。
    1. 如果当前行是第一行(Index = 0),请跳过
    2. 否则,请从Cells [columnName]。Value获取当前行和上一行所需列的值。
    3. 比较他们。如果它们相同,则为apply a style,例如背景颜色。

答案 1 :(得分:0)

这将是#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)这会对第一列进行排序,并找到欺骗行为。

由于排序,不确定单元格格式是否正常工作。可能更好的填充数组然后排序,然后找到它的dupe然后循环通过dgv并设置单元格尚未排序时的格式。或者您可以查看dgv rowprepaint event可能会帮助您。