2009-05-06 11 views
8

He creado una lista IEnumerable de pilotos de carreras utilizando LINQ a partir de una matriz de cadenas como tal a continuación:Estoy tratando de aprender cómo enlazar una colección LINQ IEnumerable a un repetidor

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; 

estoy simplemente hacer que sea sencillo por ahora.

luego ato a un GridView ASP.NET como es abajo:

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

Esto funciona bien. Ahora quiero tomar la misma salida (resultado) y vincularla a un repetidor, pero no importa lo que intento, no puedo hacer que funcione el repetidor y creo que me falta algo de comprensión clave de LINQ y cómo funciona con ASP.NET .

A continuación se muestra la página completa aspx para mostrar dónde he conseguido hasta ahora. Por favor, ¿puede alguien (suavemente si es posible) guiarme de vuelta al camino?

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

uso el siguiente código para enlazar el resultado al repetidor:

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

me sale el siguiente error al intentar ejecutar la página con el repetidor en:

Excepción Detalles: System.Web.HttpException: DataBinding: 'System.String' no contiene una propiedad con el nombre 'controlador'.

Respuesta

9

Obtendrás un listado de cadenas sin nombre. Si desea utilizar el controlador de nombre de propiedad, puede hacer un tipo anónimo y decir:

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

luego haga la vinculación de datos.

Creo que se puede también Eval(".") para evaluar el propio objeto y no una propiedad. Además, como varias personas han dicho a continuación, puede usar <%# Container.DataItem %>.

+1

var = desde el controlador en driverNames? ¿Dónde está el nombre de la variable? var foo = del controlador en driverNames, edítelo chico;) – Sadegh

+0

Lo siento cuando pruebo ese código me sale "Error \t 1 No puedo convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable ' a 'System.Collections .Generic.IEnumerable '. Existe una conversión explícita (¿falta un molde?) " –

+0

Tengo que usar un nombre diferente al del minúsculo, supongo. –

0

Debido a que una cadena no tiene una propiedad llamada "conductor" y está utilizando una lista de cadenas, esto no funcionará. Trate de reemplazar la declaración Eval con Container.DataItem

1

tratar

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

El eval está buscando una propiedad denominada controlador, pero usted tiene el nombre del controlador tendrán algo como una cadena. Sería como llamar a "nombre del conductor" .DriverName. La enumeración de su colección está trabajando con los elementos reales. Si tuvieras una colección como IList drivers, entonces eso funcionaría.

4

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

<%# Container.DataItem %> 
+0

+1 Esto también funciona como una solución alternativa. Gracias por tu ayuda. –

0

¿está seguro de que no hay tipo? como el código se ve bien

también se puede utilizar seleccione nuevo controlador = {conductor, DriverAge = driverage, etc ..}

a continuación en su página ASPX se utiliza este siguiente

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

esperanza esto ayuda.

0

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

1

Comprendo que esto es una vieja pregunta, pero quería señalar que una matriz de cadenas ya está IEnumerable<string> y se podía enlazar la matriz directamente al repetidor usando la respuesta de Mehrdad:

<%# Container.DataItem %> 
Cuestiones relacionadas