2013-03-20 94 views
0

我有一个DataGridView从MySQL数据库填充,并点击一个按钮,我希望通过突出显示特定列中的重复项来验证表。高亮DataGridView VB.NET中的任何重复

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

+0

你有多少列?你能指出列名吗? – 2013-03-20 17:10:47

+0

你能否在你的问题中包含一个具有所需行为的模型? – Neolisk 2013-03-21 00:22:22

回答

0

按您希望突出显示的列对DataGridView进行排序,然后遍历每一行。如果列值与之前的值相同,请应用高亮。

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

没有时间掀起一些示例代码,但它不应该太难。

编辑

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

这就是问题所在,我不知道如何做到这一点 – user1662306 2013-03-20 16:50:35

+1

Downvoter:这可能不是世界上最有用的答案,但是你真的会把它归类为无用吗? OP只是要求最好的方式,而不是代码示例。 – JDB 2013-03-20 20:10:05

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)这将排序第一列,并找到愚蠢。

不确定单元格格式是否会因排序而正常工作。可能会更好地填充数组然后进行排序,然后找到这些数组,然后通过dgv进行循环,并在未对其进行排序时设置单元格的格式。或者你可以看看dgv rowprepaint event可能会帮助你。