2008-09-10 7 views
4

Это веб-приложение ASP.Net 2.0. Шаблон товара выглядит следующим образом, для справки:Программный доступ к данным в репитере 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> 

Используя это в коде:

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+ года), и я просто совсем забыл об этом. Йиш, поговорите о том, чтобы пропустить что-то очевидное. , ,

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

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

+0

Я не понимаю, что вы подразумеваете под «получить» данные. Не факт, что у вас есть доступ к rptrFollowUpSummary, означает, что у вас уже есть данные в его исходной форме? – 2008-09-10 17:05:18

ответ

6

Off верхней части моей головы, вы можете попробовать что-то вроде этого:

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

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

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

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

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

0

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

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

0

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

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

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

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

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

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

0

@peacedog:

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

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

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

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

Удачи вам!