2009-05-06 9 views
8

ho creato una lista IEnumerable dei piloti che utilizzano LINQ da un array di stringhe come tali sotto:Sto cercando di imparare come associare una raccolta IEnumerable LINQ ad un ripetitore

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; 

sto solo mantenerlo semplice per adesso.

ho quindi associare ad un ASP.NET GridView in questo modo qui di seguito:

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

Questo funziona bene. Ora voglio prendere lo stesso risultato (risultato) e collegarlo a un ripetitore, ma non importa quello che cerco Non riesco a far funzionare il ripetitore e penso che mi manchi una certa comprensione chiave di LINQ e come funziona con ASP.NET .

Di seguito è riportata la pagina completa di aspx per mostrare dove sono arrivato fino ad ora. Per favore qualcuno può (gentilmente se possibile) guidarmi sul sentiero?

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

Io uso il seguente codice per associare il risultato al ripetitore:

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

ricevo il seguente errore quando provo a fare funzionare la pagina con il ripetitore in:

Eccezione Dettagli: System.Web.HttpException: DataBinding: 'System.String' non contiene una proprietà con il nome 'driver'.

risposta

9

Si sta recuperando un numero infinito di stringhe senza nome. Se si desidera utilizzare il driver del nome della proprietà è possibile effettuare un tipo anonimo e dire:

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

quindi eseguire l'associazione.

Credo che si possa anche Eval(".") valutare l'oggetto stesso e non una proprietà. Anche come più persone hanno detto di seguito è possibile utilizzare <%# Container.DataItem %>.

+1

var = dal driver in driverNames? dov'è il nome della variabile? var foo = dal driver in driverNames, edit it guy;) – Sadegh

+0

Scusa quando provo quel codice ottengo "Errore \t 1 Impossibile convertire implicitamente il tipo 'System.Collections.Generic.IEnumerable ' a 'System.Collections .Generic.Inumerable '. Esiste una conversione esplicita (ti manca un cast?) " –

+0

Devo usare un nome diverso dal driver in minuscolo, immagino. –

0

Poiché una stringa non ha una proprietà chiamata "driver" e si sta utilizzando un elenco di stringhe, questo non funzionerà. Provare a sostituire la dichiarazione Eval con Container.DataItem

1

provare

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

L'eval è alla ricerca di un driver proprietà denominata ma si deve il nome del driver actuall come una stringa. Sarebbe come chiamare "drivername" .DriverName. L'enumerazione della tua collezione funziona con gli articoli reali. Se avessi effettivamente una collezione come i driver IList, allora funzionerebbe.

4

Change <%# Eval("driver") %> a

<%# Container.DataItem %> 
+0

+1 Funziona bene anche come soluzione alternativa. Grazie per l'aiuto. –

0

sei sicuro che non ci sia nessun tipo? come il codice sembra buono.

è possibile utilizzare anche selezionare nuova {Driver = conducente, DriverAge = driverage, etc ..}

poi nella tua pagina ASPX si utilizza questa seguente

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

speranza che questo aiuti.

0

o semplicemente <%# Eval("result.Driver") %>

1

Mi rendo conto che è una vecchia questione, ma ho voluto sottolineare che un array di stringhe già è IEnumerable<string> e si può solo associare la matrice direttamente al ripetitore usando la risposta di Mehrdad:

<%# Container.DataItem %> 
Problemi correlati