2010-07-23 3 views
2

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

' 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) 

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

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

ответ

5

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

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

Ничего себе, это так ... элегантный. :-) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * У меня еще не было возможности реализовать его, но это выглядит потрясающе. +1 для простоты! Я попробую и дам вам знать, как это работает. Благодаря! –

+0

Это сработало очень хорошо. Просто нужно было добавить блок Try ... Catch для обработки, когда строка представляет собой новую строку (не может фильтровать ее в предложении Where, потому что мы ссылаемся на нее, как если бы она имела данные в предложении From) но кроме этого, это было прекрасно. Еще раз спасибо!!!! –

+0

Мое удовольствие, рад, что это сработало для вас :) – knslyr

0

Проводка полного фрагмента кода с помощью реакции 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 
+0

Это работает, но для того, чтобы заманить меня в исключение. Кто-нибудь знает, как обойти это? Похоже, что это не выполнимо, потому что исключение выбрано путем поиска в новой строке, у которой нет ячеек, и мы указываем поиск соты с места в карьер. Я пробовал делать «Из строки в dgv.rows, где не row.isnewrow», но это не скомпилировалось. Должно быть, это будет вокруг ... может быть. :-) –

Смежные вопросы