我有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
答案 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