2009-10-06 7 views
2

je tentais d'aider quelqu'un d'autre et a écrit cette requête:Pourquoi cette requête LINQ ne fonctionne-t-elle pas?

var foundTab = (from tab in tabControl1.TabPages 
       where tab.Name == "tabName" 
       select tab).First(); 

Et ils ont rapporté qu'ils ont reçu cette erreur:

Could not find an implementation of the query pattern for source type System.Windows.Forms.TabControl.TabPageCollection'. 'Where' not found. Consider explicitly specifying the type of the range variable 'tab'.

j'ai vérifié MSDN et TabPageCollection outils IList, ICollection, IEnumerable. Alors, que se passe-t-il ici? Que signifie cette erreur et existe-t-il un autre moyen d'interroger la propriété TabPages du contrôle d'onglet?

Répondre

8

Essayez ceci:

var tab = (from System.Windows.Forms.TabPage tab in tabControl1.TabPages 
      where tab.Name == "tabName" 
      select tab).First(); 

Ce code spécifie le type de la variable de portée.

+0

J'oublie toujours celui-là :) – leppie

+0

Apparaît un peu plus propre que la méthode cast. Merci! – jasonh

0

Essayez ceci:

var tab = tabControl1.TabPages.FirstOrDefault(t => t.Name == "tabName"); 

Aussi, assurez-vous que vous avez

using System.Linq; 

en haut de votre fichier.

Dylan

4

TabPageCollection implémente IEnumerable mais pas IEnumerable<T> qui est ce qui utilise LINQ. Pour corriger, utilisez la méthode cast comme suit:

var foundTab = (from tab in tabControl1.TabPages.Cast<TabPage>() 
      where tab.Name == "tabName" 
      select tab).First(); 
+0

Outre les erreurs d'origine que j'ai faites ("tab" deux fois et j'ai oublié la clause select, je suis surpris, personne n'a remarqué, LOL!), Cela fonctionne parfaitement. Merci d'avoir mentionné l'explication 'IEnumerable' /' IEnumerable '. – jasonh

+0

Erreur: Le corps de l'aquarelle doit se terminer par une clause de sélection ou de groupe – Anuya

+0

Huh! Erreur de copie-n-collage: P –

2

Mais, mais mais ....? vous pourriez juste le référencer directement si vous avez le nom? TabPages ["tabname"]

+0

Hush you! Si vous n'utilisez pas LINQ, vous ne programmez pas ... – Massif

+0

J'ai programmé pendant 20 ans, j'ai fait LINQ avant que vous n'ayez plus de couches. travaillé sur l'équipe Premier .NET de Microsoft. Tais-toi, imbécile! (LOL - juste s'amuser) :) et si vous avez déjà subi une interview de Microsoft, ils vous crieraient d'utiliser les frais généraux de LINQ (que j'aime) au lieu de simplement indexer dans l'indexeur de tabges. –

Questions connexes