2009-05-06 4 views
8

ich eine IEnumerable Liste der Rennfahrer erstellt haben LINQ als solche aus einem String-Array mit unter:Ich versuche, einen Repeater zu lernen, wie eine IEnumerable LINQ Sammlung zu binden

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; 

ich es einfach nur am halten zur Zeit.

Ich binde es dann zu einer ASP.NET Gridview wie so unten:

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

Dies funktioniert gut. Jetzt möchte ich die gleiche Ausgabe (Ergebnis) nehmen und sie an einen Repeater binden, aber egal, was ich versuche, ich kann den Repeater nicht zum Laufen bringen und ich denke, dass mir ein grundlegendes Verständnis von LINQ fehlt und wie es mit ASP.NET funktioniert .

Unten ist die vollständige aspx Seite zu zeigen, wo ich bis jetzt habe. Kann jemand (sanft wenn möglich) mich auf den Weg zurückführen?

<%@ 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> 

Ich verwende den folgenden Code das Ergebnis an den Repeater zu binden:

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

ich folgende Fehlermeldung erhalten, wenn ich versuche, die Seite mit dem Repeater in auszuführen:

Exception Details: System.Web.HttpException: DataBinding: 'System.String' enthält keine Eigenschaft mit dem Namen 'Treiber'.

Antwort

9

Sie erhalten eine Aufzählung von Strings ohne Namen zurück. Wenn Sie den Namen des Eigenschaftentreibers verwenden möchten, können Sie einen anonymen Typ erstellen und sagen:

dann die Datenbindung durchführen.

Ich glaube, Sie können auch Eval(".") das Objekt selbst bewerten und keine Eigenschaft. Auch wie mehrere Leute unten gesagt haben, können Sie verwenden.

+1

var = vom Treiber in driverNames? Wo ist der Variablenname? var foo = vom Treiber in driverNames, bearbeiten Sie es Kerl;) – Sadegh

+0

Sorry, wenn ich diesen Code bekomme ich bekomme "Fehler \t 1 Kann Typ 'System.Collections.Generic.IEnumerable nicht ' zu 'System.Collections .Generic.IEnumerable '. Eine explizite Konvertierung existiert (fehlt Ihnen ein Cast?) " –

+0

Ich muss einen anderen Namen als den Kleinbuchstaben-Treiber verwenden, denke ich. –

0

Da eine Zeichenfolge keine Eigenschaft namens "Treiber" hat und Sie eine Liste von Zeichenfolgen verwenden, wird dies nicht funktionieren. Versuchen Sie, die Eval-Anweisung mit Container.DataItem ersetzt

1

versuchen

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

Die eval für eine Eigenschaft mit dem Namen Fahrer suchen, aber Sie haben den actuall Treibernamen als String zurück. Es wäre, als würde man "drivername" .DriverName aufrufen. Die Aufzählung Ihrer Sammlung arbeitet mit den tatsächlichen Elementen. Wenn Sie tatsächlich eine Sammlung wie IList-Treiber hätten, dann würde das funktionieren.

4

ändern <%# Eval("driver") %> zu

<%# Container.DataItem %> 
+0

+1 Dies funktioniert auch als eine alternative Lösung. Danke für Ihre Hilfe. –

0

sind Sie sicher, dass es kein Typ ist? wie der Code gut aussieht.

Sie können auch neue verwenden wählen {Driver = Treiber, DriverAge = driverage, etc ..}

dann in Ihrer ASPX-Seite verwenden diese folgende

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

Hoffnung, das hilft.

0

oder einfach <%# Eval("result.Driver") %>

1

Ich weiß, das eine alte Frage, aber ich wollte darauf hinweisen, dass bereits ein String-Array IEnumerable<string> ist und man konnte nur das Array bindet direkt an den Repeater Mehrdad Antwort mit:

<%# Container.DataItem %> 
Verwandte Themen