2010-07-23 6 views
2

Je suis encore relativement nouveau à LINQ, et j'ai fait plus de trébucher que tout, mais j'ai vraiment aimé ce que j'ai vu jusqu'ici. Donc, dans cet esprit, j'ai une routine de recherche VB.NET, dont une partie est fournie ci-dessous, qui vérifie toutes les cellules Text dans un DataGridView pour une chaîne donnée (inclusive), en utilisant un ensemble de boucles imbriquées de base pour effectuer la recherche :Recherche de cellules DataGridView à l'aide d'une requête 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) 

Assez simple. Maintenant, ma question est: existe-t-il un moyen de répliquer ce comportement en utilisant LINQ? Fondamentalement, je voudrais que la requête sélectionne (ou retourne) le premier DataGridViewCell dont le texte contient la chaîne de recherche. J'ai fait quelques bricolages avec des sous-requêtes et autres, mais j'ai toujours du mal à envelopper mon cerveau autour des concepts (trop d'années à écrire du T-SQL, je suppose).

Évidemment, la boucle imbriquée fonctionne très bien, c'est donc plus une curiosité, vraiment. Merci d'avance!

Répondre

5

j'ai pu utiliser ce code avec un certain succès:

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 

... etc ...

+0

Wow, c'est tellement ... élégant. :-) N'a même pas * penser * à interroger à partir de 2 choses à la fois. Je n'ai pas encore eu l'occasion de l'implémenter, mais ça a l'air génial. +1 pour la simplicité! Je vais l'essayer et vous laisser savoir comment cela fonctionne. Merci! –

+0

Cela a très bien fonctionné. Juste dû ajouter un bloc Try ... Catch à gérer lorsque la ligne est une nouvelle ligne (impossible de la filtrer dans la clause Where car nous la référons comme si elle contenait déjà des données dans la clause From), mais à part ça, c'était parfait. Merci encore!!!! –

+0

Mon plaisir, heureux que cela a fonctionné pour vous :) – knslyr

0

L'affichage d'un extrait de code complet en utilisant la réponse de knslyr, mais dans le contexte de mon code d'origine , juste pour la postérité:

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

Cela fonctionne, mais avoir à piéger une exception de type bugs moi. Quelqu'un sait-il comment contourner cela? On dirait que ce n'est pas faisable, parce que l'exception est lancée en cherchant sur la nouvelle ligne, qui n'a pas de cellules, et nous spécifions la recherche de cellule dès le départ. J'ai essayé de faire "From row in dgv.rows where not row.isnewrow" mais cela ne compilerait pas. Il doit y avoir un moyen de contourner ça ... peut-être. :-) –

Questions connexes