Программный доступ к данным в ретрансляторе ASP.NET 2.0 - PullRequest
4 голосов
/ 10 сентября 2008

Это веб-приложение ASP.Net 2.0. Шаблон элемента выглядит следующим образом:

<ItemTemplate>
  <tr>
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td>
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td>
  </tr>
</ItemTemplate>

Использование этого в codebehind:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text;
    Trace.Write(val);
}

Я произвожу это:

<tr>
  <td class="class1" align=center><a href='url'><img src="img.gif"></a></td>
  <td class="class1">23</td>
  <td class="class1">1/1/2000</td>
  <td class="class1">-2</td>
  <td class="class1">11</td>
</tr>

Что мне нужно, так это данные из Field1 и Field4

Кажется, я не могу получить данные так, как я бы сказал, в DataList или GridView, и я не могу придумать что-либо еще в Google или быстро использовать это, чтобы делать то, что я хочу. Единственный способ увидеть данные - использовать регулярное выражение для получения и получения данных (потому что человек берет то, что хочет. Он берет все это. И я мужчина, не так ли? Арен? не так ли?)

Я на правильном пути (не ищу конкретного регулярного выражения, чтобы сделать это; подделка, которая может быть последующим вопросом;)), или я что-то упустил?


Повторитель в этом случае установлен в камне, поэтому я не могу переключиться на что-то более элегантное. Когда-то я делал что-то похожее на то, что Элисон Чжоу предлагал использовать DataLists, но это было какое-то время (2+ года), и я просто полностью забыл сделать это таким образом. Даааа, поговорим о том, чтобы упустить что-то очевидное , .

Итак, я сделал, как предложила Элисон, и все работает отлично. Я не думаю, что представление состояния является проблемой здесь, хотя этот ретранслятор может получить десятки строк. Я не могу говорить с этим вопросом, если я делаю это таким образом, вместо того, чтобы использовать вместо этого (но это кажется мне хорошим решением в противном случае). Очевидно, что последнее не так сильно влияет на состояние обзора, но я недостаточно опытен, чтобы сказать, когда один подход может быть предпочтительнее другого без крайнего примера передо мной. Элисон, один вопрос: почему литералы, а не метки?

Евро Мичелли, я пытался избежать обратной поездки в базу данных. Поскольку я все еще немного зеленоват по отношению к остальному миру разработки, я признаю, что не обязательно хорошо понимаю, сколько поездок по базам данных «просто правильно». Здесь не было бы проблемы с производительностью (я знаю загрузку приложения, достаточную для того, чтобы это знать), но я полагаю, что пытался избежать ее по привычке, поскольку мой босс, как правило, выделяет меньше поездок, где это возможно.

Ответы [ 5 ]

6 голосов
/ 10 сентября 2008

С макушки головы, вы можете попробовать что-то вроде этого:

<ItemTemplate>
  <tr>
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td>
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td>
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td>
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td>
  </tr>
</ItemTemplate>

Затем в своем коде вы можете получить доступ к каждому элементу управления Literal следующим образом:

foreach (RepeaterItem item in rptrFollowupSummary.Items)
{   
    Literal lit1 = (Literal)item.FindControl("litField1");
    string value1 = lit1.Text;
    Literal lit4 = (Literal)item.FindControl("litField4");
    string value4 = lit4.Text;
}

Это добавит ваш ViewState, но облегчит поиск ваших элементов управления.

2 голосов
/ 10 сентября 2008

Поскольку вы работаете с табличными данными, я бы рекомендовал использовать элемент управления GridView. Тогда вы сможете получить доступ к отдельным ячейкам.

В противном случае вы можете установить значения для полей Field1 и Field4 на runat="server" и присвоить им идентификаторы. Затем в codebehind, доступ к свойству InnerText для каждого тд.

0 голосов
/ 10 сентября 2008

@ peacedog :

Корректное; Метод Элисон вполне приемлем.

Уловка с обходом базы данных: они, очевидно, не являются бесплатными, но веб-серверы, как правило, очень "близко" (быстрое соединение с низкой задержкой) к базе данных, в то время как ваши пользователи, вероятно, "далеко" (медленные, подключение с высокой задержкой).

Из-за этого отправка данных в / из браузера через файлы cookie, ViewState, скрытые поля или любым другим способом на самом деле может быть «хуже», чем повторное чтение из вашей базы данных. Следует также помнить о безопасности (может ли «злой» пользователь подделать данные, возвращаемые из браузера? Будет ли это важно, если они это сделают?).

Но довольно часто это не влияет на производительность. Вот почему вы должны делать то, что более естественно работает для вашей конкретной проблемы, и беспокоиться об этом только , если производительность становится реальной проблемой.

Удачи!

0 голосов
/ 10 сентября 2008

Механизм <% # DataBinder.Eval (...)%> не является привязкой данных в «строгом» смысле. Это односторонний метод размещения текста в определенных местах шаблона.

Если вам нужно вернуть данные, вам необходимо:

  1. Получите его из исходных данных
  2. Заполните ретранслятор другим механизмом

Обратите внимание, что Repeater не сохраняет DataSource между постбэками, вы не можете просто попросить его предоставить вам данные позже.

С первым методом обычно легче работать. Не думайте, что получить данные из источника слишком дорого, если только вы сами не докажете это путем измерения; это обычно довольно быстро. Самая большая проблема с этим методом заключается в том, что исходные данные могут меняться между вызовами.

Для второго метода распространенной техникой является использование элемента управления Literal. См. Сообщение Элисон Чжоу о том, как это сделать. Я обычно лично предпочитаю заполнять элементы управления Literal внутри OnItemDataBound вместо

0 голосов
/ 10 сентября 2008

Если вы можете позволить себе больше накладных расходов при генерации, перейдите к DataList и используйте свойство DataKeys, которое сохранит нужные вам поля данных.

Вы также можете использовать метки в каждой ячейке таблицы и иметь возможность ссылаться на элементы с помощью e.Item.FindControl ("LabelID").

...