带有HiddenField的中继器

时间:2010-12-14 04:05:18

标签: c# asp.net repeater hidden-field

我在标有“AdminGetAllRPT”的Repeater中有以下HiddenField:

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

我有一个触发此代码的链接按钮:

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

但是hf即将出现。我做错了什么?

4 个答案:

答案 0 :(得分:11)

更改AdminGetAllRPT.FindControl ...

... e.Item.FindControl

编辑:感谢您对正确答案的投票。

但是,是的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;
}

完成...


要遍历所有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
    }
}

答案 1 :(得分: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是控件的容器,您现在应该能够将该控件作为第一级子项找到。如果它不是按钮的子节点,您将需要将其设为子节点,或者从其他方法引用它。对于动态生成的控件尤其如此。也就是说...它是一个孩子的控制或根元素?

答案 2 :(得分:0)

您需要在RepeaterItem中找到隐藏字段。

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

答案 3 :(得分: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");