DataGridView поиск ячейки с помощью запроса LINQ - PullRequest
2 голосов
/ 23 июля 2010

Я все еще относительно новичок в LINQ и сделал больше спотыкания, чем что-либо еще, но мне действительно понравилось то, что я видел до сих пор.Имея это в виду, у меня есть подпрограмма поиска VB.NET, часть которой представлена ​​ниже, которая проверяет все текстовые ячейки в DataGridView на наличие заданной строки (включительно), используя базовый набор вложенных циклов для выполнения поиска.:

' Search for the first occurrence of the given string
For Each row As DataGridViewRow In dgvMembers.Rows
    ' Skip the new row
    If row.IsNewRow Then Exit For

    ' Loop through all the cells in the current row
    For Each cell As DataGridViewCell In row.Cells
        ' Skip non-text cells
        If cell.GetType IsNot GetType(DataGridViewTextBoxCell) Then Continue For

        ' Search for our matching text
        If cell.Value.ToString.ToUpper.Contains(searchText) Then
            ' Select the cell if we have a match
            dgvMembers.CurrentCell = cell
            WriteMessage("String '{0}' found.", searchText)
            Exit Sub
        End If
    Next
Next

' If we get to this point, we didn't find anything
WriteMessage("String '{0}' NOT found.", searchText)

Довольно просто.Теперь мой вопрос: есть ли способ воспроизвести это поведение с помощью LINQ?По сути, я хотел бы, чтобы запрос выбрал (или возвратил) первый DataGridViewCell, текст которого содержит строку поиска.Я немного поработал с подзапросами и тому подобным, но мне все еще не удается обернуть мой мозг вокруг этих концепций (я думаю, слишком много лет написания T-SQL).

Очевидно, что вложенный цикл работает нормально, так что на самом деле это скорее любопытство.Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 24 июля 2010

Я смог использовать этот код с некоторым успехом:

Dim qry = From theRow as DataGridViewRow In dgvMembers.Rows, _
               theCell as DataGridViewCell In theRow.Cells _
          Where theCell.Value.ToString.ToUpper = searchText _
          Select theCell


Dim matchCell as DataGridViewCell = qry.First

dgvMembers.CurrentCell = matchCell

... и т.д ...

0 голосов
/ 27 июля 2010

Отправка полного фрагмента кода с использованием ответа knslyr, но в контексте моего исходного кода, просто для потомков:

Try
    ' Search (case insensitive) for the first occurrence of the given string
    Dim foundCell As DataGridViewCell = (
        From row As DataGridViewRow In dgvMembers.Rows,
        cell As DataGridViewCell In row.Cells
        Where cell.Value.ToString.ToUpper.Contains(searchText)
        Select cell
    ).First

    ' If we have a match, select it
    If foundCell IsNot Nothing Then
        ' Select the cell if we have a match
        dgvMembers.CurrentCell = foundCell
        WriteMessage("String '{0}' found.", searchText)
    Else
        ' No cell found.  Whoops.
        WriteMessage("String '{0}' NOT found.", searchText)
    End If
Catch ex As Exception
    ' An exception probably means the New row was reached.  So, no dice.
    WriteMessage("String '{0}' NOT found.", searchText)
End Try
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...