Почему элемент нижнего колонтитула не включен в Repeater.Items? - PullRequest
5 голосов
/ 30 января 2009

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

ASPX:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        Item<br />
    </ItemTemplate>
    <FooterTemplate>
        Footer<br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    </FooterTemplate>
</asp:Repeater>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

Код-behind.cs:

protected void Page_Load(object sender, EventArgs e)
{
    ListItemCollection items = new ListItemCollection();
    items.Add("value1");
    items.Add("value2");
    Repeater1.DataSource = items;
    Repeater1.DataBind();
}

protected void Button1_Click(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine(Repeater1.Items.Count);
}

Этот код будет выводить только «2» в качестве счетчика, так как мне получить ссылку на мое текстовое поле в шаблоне подвала?

Ответы [ 3 ]

1 голос
/ 11 июня 2009

Вы можете найти элементы управления в повторителе. Это даст вам все элементы управления в репитере (RepeaterItems коллекция). Теперь вы можете сделать что-то вроде этого:

RepeaterItem footerItem=null;
foreach(Control cnt in Repeater1.Controls)
{
if(cnt.GetType() == typeof(RepeaterItem) && ((RepeaterItem)cnt).ItemType == ListItemType.Footer)
{
footerItem = cnt;
break;
}
}
1 голос
/ 30 января 2009

Из документации MSDN , Предметы - это просто набор RepeaterItems, основанный на Источнике данных, к которому вы привязываетесь, и не включает элементы в Заголовочные или FooterTemplates.

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

1007 * Е.Г. *

private void Repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
{

  if (e.Item.ItemType == ListItemType.Footer) 
  {
    TextBox textBox = e.Item.FindControl("TextBox1") as TextBox;
  }
}    
0 голосов
/ 25 сентября 2009

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

RepeaterItem riFooter = Repeater1.Controls[Repeater1.Controls.Count - 1] as RepeaterItem;
if (riFooter != null && riFooter.ItemType == ListItemType.Footer) {
    TextBox TextBox1 = riFooter.FindControl("TextBox1") as TextBox;
    if (TextBox1 != null) {
        TextBox1.Text = "Test";
    }
}
...