2009-05-06 9 views
8

J'ai créé une liste IEnumerable des pilotes de course en utilisant LINQ à partir d'un tableau de chaînes en tant que telle ci-dessous:Je suis en train d'apprendre comment lier une collection LINQ IEnumerable à un répéteur

string[] driverNames = { 
           "Lewis Hamilton", 
           "Heikki Kovalainen", 
           "Felipe Massa", 
           "Kimi Raikkonen", 
           "Robert Kubica", 
           "Nick Heidfeld", 
           "Fernando Alonso", 
           "Nelson Piquet Jr", 
           "Jarno Trulli", 
           "Timo Glock", 
           "Sebastien Bourdais", 
           "Sebastien Buemi", 
           "Mark Webber", 
           "Sebastian Vettel", 
           "Nico Rosberg", 
           "Kazuki Nakajima", 
           "Adrian Sutil", 
           "Giancarlo Fisichella", 
           "Jenson Button", 
           "Rubens Barrichello" 
          }; 

IEnumerable<string> result = from driver in driverNames 
          orderby driver 
          select driver; 

Je suis juste garder les choses simples pour l'instant.

comme si je lie ci-dessous puis à un ASP.NET GridView:

GV_CurrentF1Drivers.DataSource = result; 
GV_CurrentF1Drivers.DataBind(); 

Cela fonctionne très bien. Maintenant, je veux prendre la même sortie (résultat) et la lier à un répéteur, mais peu importe ce que j'essaie, je ne peux pas obtenir le répéteur de travailler et je pense qu'il me manque une compréhension clé de LINQ et comment cela fonctionne avec ASP.NET .

Ci-dessous la page ASPX complète pour montrer où je dois aller jusqu'à présent. S'il vous plaît quelqu'un peut (doucement si possible) me guider sur le chemin?

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Example1.aspx.cs" Inherits="Example1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div style="float: left;"> 
     <asp:GridView ID="GV_CurrentF1Drivers" runat="server" /> 
    </div> 
    <div style="float: left;"> 
     <asp:Repeater ID="R_CurrentF1Drivers" runat="server"> 
      <ItemTemplate> 
       <%# Eval("driver") %></ItemTemplate> 
     </asp:Repeater> 
    </div> 
    </form> 
</body> 
</html> 

J'utilise le code suivant pour lier le résultat au répéteur:

R_CurrentF1Drivers.DataSource = result; 
R_CurrentF1Drivers.DataBind(); 

je reçois l'erreur suivante lorsque je tente de lancer la page avec le répéteur dans:

Exception Détails: System.Web.HttpException: DataBinding: 'System.String' ne contient pas de propriété portant le nom 'driver'.

Répondre

9

Vous récupérez une énumération de chaînes sans nom. Si vous voulez utiliser le pilote de nom de la propriété, vous pouvez faire un type anonyme et dire:

var result = from driver in driverNames 
      orderby driver 
      select new { Driver = driver }; 

puis faire la liaison de données.

Je crois que vous pouvez aussi Eval(".") pour évaluer l'objet lui-même et pas une propriété. Aussi comme plusieurs personnes l'ont dit ci-dessous, vous pouvez utiliser <%# Container.DataItem %>.

+1

var = du pilote dans driverNames? où est le nom de la variable? var foo = du pilote dans driverNames, éditez-le guy;) – Sadegh

+0

Désolé quand j'essaye ce code je reçois "Erreur \t 1 Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable ' en 'System.Collections .Generic.IEnumerable 'Une conversion explicite existe (manque-t-il une distribution?) " –

+0

Je dois utiliser un nom différent de celui du pilote en minuscule. –

0

Étant donné qu'une chaîne n'a pas de propriété appelée "pilote" et que vous utilisez une liste de chaînes, cela ne fonctionnera pas. Essayez de remplacer la déclaration Eval avec Container.DataItem

1

essayer

<%# Container.DataItem.ToString() %> 

Le eval est à la recherche d'un bien nommé pilote, mais vous avez le nom du pilote actuall comme une chaîne. Ce serait comme appeler "drivername" .DriverName. L'énumération de votre collection fonctionne avec les éléments réels. Si vous aviez réellement une collection comme les drivers IList, alors ça marcherait.

4

changement <%# Eval("driver") %> à

<%# Container.DataItem %> 
+0

+1 Cela fonctionne bien comme une solution alternative aussi. Merci de votre aide. –

0

êtes-vous sûr qu'il n'y a pas de type? comme le code semble bien.

vous pouvez également utiliser select nouveau {Driver = pilote, DriverAge = driverage, etc ..}

puis dans votre page ASPX vous utilisez ce qui suit

<ItemTemplate> 
<div class="Driver"><%# Eval("Driver") %></div> 
<div class="DriverAge"><%# Eval("DriverAge ") %></div> 
</ItemTemplate> 

espérons que cette aide.

0

ou simplement <%# Eval("result.Driver") %>

1

Je sais que c'est une vieille question, mais je voulais signaler qu'un tableau de chaînes est déjà IEnumerable<string> et vous pouvez simplement lier le tableau directement au répéteur en utilisant la réponse de Mehrdad:

<%# Container.DataItem %> 
Questions connexes