如何使用字符串数组根据 DGV 列过滤行?
How to filter rows based on DGV column with a string array?
我正在尝试对 DGV 行进行排序并过滤掉在 Employees 列数组中的任何位置找到当前员工(编号)的行。
我试过下面的代码;消息框正确显示第一个循环“2”“3”“4”5“
然后被踢出去?? (即不显示下一个循环“3”“5”“6”)
我只剩下一个空白的 DGV。
我这样做正确吗?
Try
Using AdptJobOp As New OleDbDataAdapter(sql, con)
dtJobOp = New DataTable()
AdptJobOp.Fill(dtJobOp)
For Each drJobOp As DataRow In dtJobOp.Rows
arr = Split(drJobOp.Item("Employees").ToString, ",")
For a As Integer = 0 To arr.Length
MessageBox.Show(arr(a).ToString)
If arr(a) = number.ToString Then
count = True
End If
Next a
If count = True Then
dtJobOp.Rows.Remove(drJobOp)
End If
Next drJobOp
End Using
Catch ex As Exception
End Try
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
2 3,5,6 ajfsdi jsoifjo siddj
3 6,7,3,8 sajdfssdjf ldj
Search Employees = 5 then resulting DGV should be:
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
2 3,5,6 ajfsdi jsoifjo siddj
Search Employees = 2 then resulting DGV should be:
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
问题是您要从那些相同行的 ForEach 循环内的数据table 中删除行。您不能为此使用 foreach 循环。
你有两个选择。要删除行,请尝试以下操作:
Dim i As Integer = dtJobOp.Rows.Count - 1
While i >= 0
'Where OKToDelete is whatever your code wants to test on
If OKToDelete(dtJobOp.Rows(i)) Then dtJobOp.Rows.Remove(dtJobOp.Rows(i))
'or use dtJobOp.Rows.RemoveAt(i) if you prefer
i -= 1
End While
但是您真的需要从 table 中删除行或者只是不在 DataGridView 中显示它们吗?
如果是后者,则只需将 dtJobOp 设置为您的 DataGridView 数据源,然后使用:
dtJobOp.Select("your filter expression")
只是 select 你想看到的。这当然假设您能够将上面的代码转换为一些简单的过滤器表达式,这可能是不可能的。
(代题作者贴出解决方案).
这个答案对我有用:
Private Function OKToDelete(dr As DataRow) As Boolean
Dim ans = True
Dim arr() = Split(dr.Item("Employees").ToString, ",")
For a As Integer = 0 To arr.Length - 1
If arr(a).ToString = number.ToString Then
ans = False
End If
Next a
Return ans
End Function
我正在尝试对 DGV 行进行排序并过滤掉在 Employees 列数组中的任何位置找到当前员工(编号)的行。
我试过下面的代码;消息框正确显示第一个循环“2”“3”“4”5“ 然后被踢出去?? (即不显示下一个循环“3”“5”“6”)
我只剩下一个空白的 DGV。
我这样做正确吗?
Try
Using AdptJobOp As New OleDbDataAdapter(sql, con)
dtJobOp = New DataTable()
AdptJobOp.Fill(dtJobOp)
For Each drJobOp As DataRow In dtJobOp.Rows
arr = Split(drJobOp.Item("Employees").ToString, ",")
For a As Integer = 0 To arr.Length
MessageBox.Show(arr(a).ToString)
If arr(a) = number.ToString Then
count = True
End If
Next a
If count = True Then
dtJobOp.Rows.Remove(drJobOp)
End If
Next drJobOp
End Using
Catch ex As Exception
End Try
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
2 3,5,6 ajfsdi jsoifjo siddj
3 6,7,3,8 sajdfssdjf ldj
Search Employees = 5 then resulting DGV should be:
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
2 3,5,6 ajfsdi jsoifjo siddj
Search Employees = 2 then resulting DGV should be:
Jobop Employees Details
1 2,3,4,5 dsdijfij dfjsdofj
问题是您要从那些相同行的 ForEach 循环内的数据table 中删除行。您不能为此使用 foreach 循环。
你有两个选择。要删除行,请尝试以下操作:
Dim i As Integer = dtJobOp.Rows.Count - 1
While i >= 0
'Where OKToDelete is whatever your code wants to test on
If OKToDelete(dtJobOp.Rows(i)) Then dtJobOp.Rows.Remove(dtJobOp.Rows(i))
'or use dtJobOp.Rows.RemoveAt(i) if you prefer
i -= 1
End While
但是您真的需要从 table 中删除行或者只是不在 DataGridView 中显示它们吗?
如果是后者,则只需将 dtJobOp 设置为您的 DataGridView 数据源,然后使用:
dtJobOp.Select("your filter expression")
只是 select 你想看到的。这当然假设您能够将上面的代码转换为一些简单的过滤器表达式,这可能是不可能的。
(代题作者贴出解决方案).
这个答案对我有用:
Private Function OKToDelete(dr As DataRow) As Boolean
Dim ans = True
Dim arr() = Split(dr.Item("Employees").ToString, ",")
For a As Integer = 0 To arr.Length - 1
If arr(a).ToString = number.ToString Then
ans = False
End If
Next a
Return ans
End Function