2010-12-14 2 views
1

я следующее скрытым в Repeater с надписью «AdminGetAllRPT»:Repeater с скрытыми

<asp:Repeater ID="AdminGetAllRPT" runat="server" OnLoad="AdminGetAllRPT_Load"> 
    <HeaderTemplate> 
     <table id="AdminGetAllTBL"> 
      <tr> 
       <td></td> 
       <td>Username</td> 
       <td>Email Address</td> 
       <td>First Name</td> 
       <td>Last Name</td> 
       <td>Active?</td> 
      </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <asp:LinkButton ID="AdminEditLnk" runat="server" OnClick="AdminEdit_OnClick">Edit 
       <asp:HiddenField ID="editAdminEmail" runat="server" Value='<%# Eval("emailAddress") %>' /> 
       </asp:LinkButton> 
      </td> 
      <td><%# Eval("userName") %></td> 
      <td><%# Eval("emailAddress") %></td> 
      <td><%# Eval("firstName") %></td> 
      <td><%# Eval("lastName") %></td> 
      <td><%# Eval("isActive") %></td> 
     </tr> 
    </ItemTemplate> 
    <AlternatingItemTemplate> 
     <tr class="alternateTemplate"> 
      <td> 
       <asp:LinkButton ID="AdminEditLnk" runat="server" OnClick="AdminEdit_OnClick">Edit 
       <asp:HiddenField ID="editAdminEmail" runat="server" Value='<%# Eval("emailAddress") %>' /> 
       </asp:LinkButton> 
      </td> 
      <td><%# Eval("userName") %></td> 
      <td><%# Eval("emailAddress") %></td> 
      <td><%# Eval("firstName") %></td> 
      <td><%# Eval("lastName") %></td> 
      <td><%# Eval("isActive") %></td> 
     </tr> 
    </AlternatingItemTemplate> 
    <FooterTemplate> 
      <tr> 
       <td colspan="2"><a href="#">Add Administrator</a></td> 
      </tr> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

У меня есть LinkButton, что пожары этого код:

protected void AdminEdit_OnClick(object sender, EventArgs e) 
{ 
    HiddenField hf = (HiddenField)AdminGetAllRPT.FindControl("editAdminEmail"); 

но ВЧ придумывает нуль. Что я делаю не так?

ответ

11

Изменить AdminGetAllRPT.FindControl ...

в

e.Item.FindControl ...

Edit: Спасибо за votedown на правильный ответ.

Но да e.Item.FindControl - это то, что вы хотите, потому что то, что вы пытаетесь сделать, не является событием на кнопке, это событие на ItemCommand ретранслятора.

<asp:Repeater OnItemCommand="MyButtonCommandEvent" ID="AdminGetAllRPT" runat="server" OnLoad="AdminGetAllRPT_Load"> 

Затем в коде-за вы можете установить событие

void MyButtonCommandEvent(Object src, RepeaterCommandEventArgs e) { 
    //My event that is raised for each button pressed in the RepeaterItem 
    var poo = e.Item.FindControl("myhiddenfieldid") as HiddenField; 
} 

Done ...


Чтобы перебрать все RepeaterItems, вы можете иметь кнопку снаружи из (или, может быть, в нижнем колонтитуле или что-то еще, это не повторитель ItemCommand)

foreach(var item in AdminGetAllRPT.Items) 
{ 
    if (item.ItemType == RepeaterItemType.Item || item.ItemType == RepeaterItemType.AlternatingItem) 
    { 
     var hiddenField = item.FindControl("hiddenFieldid") as HiddenField; 
     //Do Stuff 
    } 
} 
+0

Не работает, если я не в действии повторителя. – balexander

+0

@ Bry4n так на основе обновления вашего вопроса, который теперь предоставляет код. Мой ответ правильный. Ты просто делаешь это неправильно.Вам нужно добавить событие ItemCommand ретранслятора, удалить событие с вашей кнопки, и теперь вы получите e.Item.FindControl, который именно вы хотите. – Phill

+0

@ Прошу прощения. Я знаю, что e.Item используется в функциях Repeater. Я не использовал один, а обычный OnClick. Я проверю это решение, когда вернусь домой. Благодаря! – balexander

0

Вам нужно найти скрытое поле внутри RepeaterItem.

foreach(var item in AdminGetAllRPT.Items) 
{   
    var hf = (HiddenField)item.FindControl("editAdminEmail"); 
} 
+0

проблема заключается в том, что вы всегда получите скрытое поле из первой строки ретранслятора. – VinayC

+0

@VinayC, это фактически получило бы скрытое поле из каждой строки ретранслятора. – jball

2

Еще одна вещь, она не может быть инкапсулирована под вашим контролем кнопки редактирования.

Например, он должен выглядеть так, для метода управления находкой для работы:

<asp:button id="AdminEdit" runat="server" onclick.... > 
    <!-- Now put in your hidden field control inside (encapulated) in your button. --> 
    <asp:HiddenField ID="editAdminEmail" runat="server" Value='<%# Eval("emailAddress") %>' /> 
</asp:button> 

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

+0

Как бы я захватил это в коде? Использование FindControl? – balexander

0

Как jball has pointed out, вам необходимо найти уровень деталя ретранслятора. Где находится ваша кнопка ссылки? Я считаю, что он должен быть внутри ретранслятора сам (иначе вы можете иметь несколько скрытых полей (по одному для каждой строки ретранслятора) и какой из них должен быть выбран с помощью linkbutton?). Поэтому, если обе кнопки ссылки и скрытое поле находятся в повторителе, вы можете использовать такой код, как

protected void AdminEdit_OnClick(object sender, EventArgs e) 
{ 
    var repeaterItem = ((Control)sender).NamingContainer; 
    HiddenField hf = (HiddenField)repeaterItem.FindControl("editAdminEmail"); 
+0

Это работает, но есть несколько скрытых полей для каждой строки, поэтому я хочу захватить ту строку, на которую ссылается кнопка «Редактировать». – balexander

+0

@ Bry4n прочитал мой обновленный ответ, вы хотите использовать команду Item Repeater. – Phill

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