如何在DataGridView中删除具有重复值的重复行

时间:2017-03-24 15:12:55

标签: vb.net datagridview

我有DataGridView由MS SQL数据库填充。除了DateTime列之外,有些行是相同的。

是否有办法浏览DataGridView并删除特定列中具有重复值的所有行?

这是我正在尝试的一些内容,但它不返回任何行:

'drop duplicate rows
Public Sub dropExclusiveRows()

    For i = 0 To DataGridView1.ColumnCount - 1
        If My.Settings("F6ExclusiveCol" & i.ToString & "Save") = True Then
            Dim stp = -1
            Dim flg As Boolean = False
            For j = DataGridView1.RowCount - 1 To 1 Step stp
                stp = -1
                For k = DataGridView1.RowCount - 2 To 0 Step -1
                    If DataGridView1.Rows(j).Cells(i).Value = DataGridView1.Rows(k).Cells(i).Value Then
                        DataGridView1.Rows.RemoveAt(k)
                        j = j - 1
                        stp = 0
                    End If
                Next
            Next
        End If
    Next

End Sub

2 个答案:

答案 0 :(得分:0)

这就是我想要的。

Public Sub dropDuplicateRows()
    Dim compSrcPntr = 0
    Dim compDestPntr
    For a = 0 To DataGridView1.ColumnCount - 1
        compSrcPntr = 0
        If My.Settings("F6ExclusiveCol" & a.ToString & "Save") = True Then
            Do Until compSrcPntr >= DataGridView1.RowCount - 2
                compDestPntr = DataGridView1.RowCount - 2
                Do Until compDestPntr = compSrcPntr
                    If DataGridView1.Rows(compDestPntr).Cells(a).Value = DataGridView1.Rows(compSrcPntr).Cells(a).Value Then
                        DataGridView1.Rows.RemoveAt(compDestPntr)
                    End If
                    compDestPntr = compDestPntr - 1
                Loop
                compSrcPntr = compSrcPntr + 1
            Loop
        End If
    Next
End Sub

答案 1 :(得分:0)

以下是使用模拟数据的示例。第一个按钮删除DataTime列的重复行,同时记住原始数据,而第二个按钮恢复原始行。

MSDN OneDrive上的项目https://1drv.ms/u/s!AtGAgKKpqdWjiDU82vb6bbBdzoGH

Public Class Form1
    Private originalDataTable As DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim dt As DataTable = MimicLoadFromDatabaseTable()
        '
        ' columns were created in the form via the chevron
        ' DataPropertyName set t C1 and C2
        '
        DataGridView1.AutoGenerateColumns = False
        DataGridView1.DataSource = dt
        originalDataTable = dt.Copy

    End Sub
    ''' <summary>
    ''' I did this so not to deal with SqlClient connection/command
    ''' </summary>
    ''' <returns></returns>
    Public Function MimicLoadFromDatabaseTable() As DataTable

        Dim dt As New DataTable

        dt.Columns.Add(New DataColumn With {.ColumnName = "C1", .DataType = GetType(String)})
        dt.Columns.Add(New DataColumn With {.ColumnName = "C2", .DataType = GetType(DateTime)})

        dt.Rows.Add(New Object() {"Karen", #1/2/2016#})
        dt.Rows.Add(New Object() {"Karen", #2/2/2016#})
        dt.Rows.Add(New Object() {"Bill", #1/2/2017#})
        dt.Rows.Add(New Object() {"Mary", #1/2/2016#})
        dt.Rows.Add(New Object() {"Mary", #2/2/2016#})
        dt.Rows.Add(New Object() {"Karen", #1/2/2016#})
        dt.Rows.Add(New Object() {"Mary", #1/2/2017#})

        Return dt

    End Function
    ''' <summary>
    ''' Remove duplicates by second column
    ''' and remember originals in private level DataTable
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub filterDuplicatesButton_Click(sender As Object, e As EventArgs) Handles filterDuplicatesButton.Click
        Dim rows As New List(Of DataRow)
        Dim dt As DataTable = CType(DataGridView1.DataSource, DataTable)
        originalDataTable = dt.Copy

        Dim query = dt.AsEnumerable _
                .GroupBy(Function(row)
                             Return New With {Key .LastName = row.Field(Of DateTime)("C2")}
                         End Function) _
                .Select(Function(group) New With
                {Key .Count = group.Count(), Key .Rows = group.ToList()}) _
                .OrderByDescending(Function(x) x.Count).ToList

        For Each item In query
            If item.Count > 1 Then
                item.Rows.RemoveAt(0)
                For Each row In item.Rows
                    rows.Add(row)
                Next
            End If
        Next
        If rows.Count > 0 Then
            ' remove the duplicates
            For Each row As DataRow In rows
                dt.Rows.Remove(row)
            Next
        End If

        filterDuplicatesButton.Enabled = False
        RestoredButton.Enabled = True
    End Sub
    ''' <summary>
    ''' Restore original rows
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub RestoredButton_Click(sender As Object, e As EventArgs) Handles RestoredButton.Click
        DataGridView1.DataSource = originalDataTable
        filterDuplicatesButton.Enabled = True
        RestoredButton.Enabled = False
    End Sub
End Class