如何使用字符串数组根据 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