Я пытаюсь узнать, как связать коллекцию IEnumerable LINQ с ретранслятором. - PullRequest
10 голосов
/ 07 мая 2009

Я создал список гонщиков IEnumerable с использованием LINQ из строкового массива, как показано ниже:

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;

Пока я просто все делаю просто.

Затем я привязываю его к ASP.NET GridView, как показано ниже:

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

Это отлично работает. Теперь я хочу взять тот же вывод (результат) и связать его с ретранслятором, но независимо от того, что я пытаюсь, я не могу заставить ретранслятор работать, и я думаю, что мне не хватает некоторого ключевого понимания LINQ и того, как он работает с ASP.NET .

Ниже приведена полная страница aspx, чтобы показать, куда я дошел. Пожалуйста, может кто-нибудь (если возможно, осторожно) направить меня обратно на путь?

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

Я использую следующий код для привязки результата к репитеру:

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

Я получаю следующую ошибку при попытке запустить страницу с повторителем в:

Сведения об исключении: System.Web.HttpException: DataBinding: «System.String» не содержит свойства с именем «driver».

Ответы [ 7 ]

9 голосов
/ 07 мая 2009

Вы получаете множество строк без имени. Если вы хотите использовать драйвер имени свойства, вы можете сделать анонимный тип и сказать:

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

, затем выполните привязку данных.

Полагаю, вы также можете Eval(".") оценить сам объект, а не свойство. Также, как несколько человек сказали ниже, вы можете использовать <%# Container.DataItem %>.

5 голосов
/ 07 мая 2009

Изменить <%# Eval("driver") %> на

<%# Container.DataItem %>
1 голос
/ 17 февраля 2010

Я понимаю, что это старый вопрос, но я хотел указать, что строковый массив уже равен IEnumerable<string>, и вы можете просто привязать массив непосредственно к повторителю, используя ответ Мехрдада:

<%# Container.DataItem %>
1 голос
/ 07 мая 2009

1001 * попробовать *

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

eval ищет свойство с именем driver, но у вас есть имя драйвера actall в виде строки. Это было бы как называть "drivername" .DriverName. Перечень вашей коллекции работает с актуальными предметами. Если у вас действительно есть коллекция, подобная драйверам IList, то это сработает.

0 голосов
/ 17 февраля 2010

или просто <%# Eval("result.Driver") %>

0 голосов
/ 07 мая 2009

ты уверен, что нет типа? как код выглядит хорошо.

вы также можете использовать выберите новый {Driver = driver, DriverAge = driverage и т. Д.}}

затем на странице ASPX вы используете следующее

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

надеюсь, это поможет.

0 голосов
/ 07 мая 2009

Поскольку строка не имеет свойства, называемого «драйвер», и вы используете список строк, это не будет работать. Попробуйте заменить оператор Eval на Container.DataItem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...