C # - Цикл через элемент управления Repeater и доступ к значениям, добавленным через DataBinder.Eval () - PullRequest
4 голосов
/ 31 августа 2011

У меня есть элемент управления Repeater, который добавляет строки в таблицу.Данные внутри каждой ячейки поступают из таблицы данных, привязанной к повторителю.

Упрощенный пример:

<asp:Repeater ID="Repeater1" runat="server">
  <ItemTemplate>
   <tr>
     <td>
        <%# DataBinder.Eval(Container.DataItem, "PartNumber")%>
     </td>
     <td>
         <%# DataBinder.Eval(Container.DataItem, "Quantity")%>
     </td>
   </tr>
</ItemTemplate>

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

Пока все, что у меня есть:

foreach (RepeaterItem ri in Repeater1.Items)
{

} 

Ответы [ 4 ]

11 голосов
/ 31 августа 2011

Я бы поместил содержимое в метки и получил доступ к меткам в коде:

<asp:Repeater ID="Repeater1" runat="server"> 
   <ItemTemplate> 
   <tr> 
     <td> 
         <asp:Label ID="lblPartNumber" runat="server" Text='<%#Eval("PartNumber")%>' /> 
     </td> 
     <td> 
         <asp:Label ID="lblQuantity" runat="server" Text='<%#Eval("Quantity")%>' />
     </td> 
   </tr> 
   </ItemTemplate> 
</asp:Repeater>

И в коде позади:

foreach (RepeaterItem ri in Repeater1.Items)
{
    Label quantityLabel = (Label)ri.FindControl("lblQuantity");
    Label partNumberLabel = (Label)ri.FindControl("lblPartNumber");

    string quantityText = quantityLabel.Text;
    string partNumberText = partNumberLabel.Text;
}
4 голосов
/ 31 августа 2011

Вы можете использовать метки:

<td>      
    <asp:Label ID="lblPartNumber" runat="server" Text='<%#Eval("PartNumber")%>' />      
</td>      
<td>      
    <asp:Label ID="lblQuantity" runat="server" Text='<%#Eval("Quantity")%>' />     
</td>  

И захват значения меток на событии повторителя OnItemDataBound.

protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs  e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {
        foreach (Control c in e.Item.Controls)
        {
            if (c is Label)
            {
                // Grab label
                Label lbl = c as Label;
                String your_value = lbl.Text;
            }
        }
    }    
1 голос
/ 31 августа 2011

можно делать то, что вы просите, извлекая элементы внутри элемента ri, что означает, что вы "можете" получить доступ к его содержимому.

Обычно подход, немного лучше, чем ваш первоначальный, состоит в том, чтобы иметь некоторые элементы управления с идентификатором и другими свойствами внутри ItemTemplate ретранслятора, чтобы вы могли просто сделать что-то вроде ri.FindControl("yourControlId"), привести его к метке или буквальному любой другой элемент управления, который вы там поместили, и используйте его значение или текстовое свойство.

это обычный способ, лучше работать с идентификаторами вместо анонимных td или tr :)

1 голос
/ 31 августа 2011

Вы хотите установить DataKeys на повторителе, чтобы вы могли получить их позже.

http://www.singingeels.com/Articles/The_ListView_Dominates_The_Repeater.aspx

РЕДАКТИРОВАТЬ: Кстати, я только что гуглил " Repeater DataKeys " и нашел эту статью вверху ... Я написал статью 4 года назад, поэтому, пожалуйста, не будьте жестокими! (там есть пример кода C #, на который вы можете посмотреть).

...