如何使用字符串数组过滤基于DGV列的行?

时间:2019-05-03 17:26:06

标签: vb.net rowfilter

我正在尝试对DGV行进行排序,并过滤掉在“雇员”列数组中任何位置都可以找到当前雇员(编号)的行。

我尝试了以下代码;消息框正确显示了第一个循环“ 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

2 个答案:

答案 0 :(得分:0)

问题是您要从同一行的ForEach循环内的数据表中删除行。您不能为此使用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

但是您是否真的需要从表中删除行,或者只是不将其显示在DataGridView中?

如果是后者,则只需将dtJobOp设置为您的DataGridView数据源,然后使用:

dtJobOp.Select("your filter expression")

只需选择要查看的内容。当然,这假设您能够将上面的代码转换为一些简单的过滤器表达式,这可能是不可能的。

答案 1 :(得分:0)

(代表问题作者发布了解决方案)

此答案对我有用:

 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