2013-03-20 84 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可能會幫助你。