Как отфильтровать строки на основе столбца DGV с массивом строк? - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь отсортировать строки 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 голосов
/ 12 мая 2019

(Размещено решение от имени автора вопроса) .

Этот ответ сработал для меня:

 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
0 голосов
/ 03 мая 2019

Проблема заключается в том, что вы удаляете строки из таблицы данных внутри цикла 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")

, чтобы просто выбрать то, что вы хотите видеть.Это предполагает, конечно, что вы можете преобразовать свой код выше в некоторое простое выражение фильтра, что может оказаться невозможным.

...