2009-10-12 3 views
0

Я пытаюсь изменить видимость пары элементов управления сервером (в частности, LinkButton и Label), которые вложены внутри части ItemTemplate ретранслятора во время события onclick того же LinkButton. Я на самом деле уже нашел решение, но я не понимаю, почему он работает, а не так, как я пытался раньше. То, что я пытался первоначально выглядит следующим образом:Почему FindControl не работает с моим ретранслятором?

Вложенные внутри ItemTemplate ретранслятора

<asp:LinkButton ID="lnAdd" CommandArgument='<%#Eval("index") %>' runat="server" Text="Add" OnClick="lnAdd_Click"> </asp:LinkButton> 

<asp:Label Visible="false" runat="server" ID="videoAdded" Text="Video Added"></asp:Label> 

Тогда внутри этой функции lnAdd_Click у меня есть:

Repeater1.FindControl("lnAdd").Visible = false; 
Repeater1.FindControl("videoAdded").Visible = true; 

где Repeater1 является идентификатором репитера, в котором находятся эти элементы управления. Это, кажется, ничего не делает (хотя оно компилируется). Я предполагаю, что это потому, что по какой-то неизвестной причине эти элементы управления не найдены.

Что работа является последним ответом на следующий вопрос: Server controls in an asp.net repeater

Решение, кажется, делать что-то очень похожее, что я пытался сделать. Его даже использует FindControl на повторителе. Единственное отличие (я вижу) состоит в том, что он получает ретранслятор через объект-отправитель. Хм, на самом деле, теперь, когда я думаю об этом, идентификатор элементов изменяется на .Net до некоторого nonesense, например, ctl00_ContentPlaceHolder1_Repeater1_ctl02_lnAdd, когда это действительно выполняется, поэтому, возможно, поэтому его не находит. Но в то же время, в рабочем решении я просто даю обычный идентификатор, например «lnAdd». Является ли .Net автоматическим переводом? Зачем это делать для этого решения, а не из-за того, как я пытался это сделать изначально?

Во всяком случае, я чувствую, что есть что-то фундаментальное здесь, что я не совсем схватывание и был бы признателен за просветление: D

ответ

2

Проблемы с использованием Repeater1.FindControl(..)... является то, что вы не можете укажите, какой конкретный ярлык или LinkButton нацелены. Это ретранслятор, поэтому каждому такому элементу присваивается уникальный идентификатор как часть RepeaterItemCollection. В разметке вы называете это «lnAdd», но это не то, что это будет когда-то генерируется и т.д.

Для справки, вот код, вы сказали, работали с другим поста:

protected void btnUpdate_OnClick(object sender, EventArgs e) 
    { 
     Button b = sender as Button; 
     if (b != null) 
     { 
      RepeaterItem ri = b.Parent as RepeaterItem; 
      if (ri != null) 
      { 
       string name = null; 

       //Fetch data 
       TextBox txtName = ri.FindControl("txtName") as TextBox; 

Я объясню причина выше работает. Во-первых, кнопка, которая была нажата, отбрасывается из объекта-отправителя. Мы знаем, что это кнопка, так как это обработчик кликов кнопки «Обновить». Затем мы также знаем, что кнопка появляется в ретрансляторе, поэтому он является родителем RepeaterItem. Вот как инициализируется и отливается переменная ri. Имея ri, используя FindControl, он теперь найдет данный элемент управления в , что определенно RepeaterItem.

1

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

Вы должны добавить OnItemCommand = «ProcessCommands» в заголовке повторителя, а затем добавить элемент ProcessCommand:

protected void ProcessCommands(object source, RepeaterCommandEventArgs e) 
{ 
    LinkButton button = (LinkButton)e.Item.FindControl("lbAdd"); 
    button.Visible = false; 
    ... 
} 

Надеется, что это помогает

+0

Спасибо за ответ, ваш метод также работал, но меня больше интересовало, почему то, что я пробовал, потерпело неудачу, и метод, который я представил, работал. Тем не менее, спасибо за ответ! – Trajanus

Смежные вопросы