1

我在标记为“AdminGetAllRPT”的中继器中有以下 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

4 回答 4

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,您可以在repeater之外有一个按钮(或者可能在页脚或其他地方,这不是repeater 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
    }
}
于 2010-12-14T04:09:51.160 回答
2

另一件事,它可能没有封装在您的编辑按钮控件下。

例如,查找控制方法应该看起来像这样才能工作:

<asp:button id="AdminEdit" runat="server" onclick.... >
   <!-- 现在将您的隐藏字段控件放入按钮中(封装)。-->
   <asp:HiddenField ID="editAdminEmail" runat="server" Value='<%# Eval("emailAddress") %>' />
</asp:button>

由于 AdminEdit.Controls 是控件的容器,您现在应该能够找到该控件作为第一级子项。如果它不是按钮的子按钮,则需要将其设为子按钮,或者从其他方法引用它。对于动态生成的控件尤其如此。即...它是哪个控件或根元素的子元素?

于 2010-12-14T04:24:59.010 回答
0

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

foreach(var item in AdminGetAllRPT.Items)
{        
   var hf = (HiddenField)item.FindControl("editAdminEmail");
}
于 2010-12-14T04:08:57.897 回答
0

正如jball 指出的那样,您需要在转发器项目级别进行搜索。您的链接按钮在哪里?我相信它应该在中继器内(否则你可以有多个隐藏字段(每个中继器行一个),哪个应该由链接按钮拾取?)。因此,如果链接按钮和隐藏字段都在转发器中,那么您可以使用诸如

protected void AdminEdit_OnClick(object sender, EventArgs e)
{
    var repeaterItem = ((Control)sender).NamingContainer;
    HiddenField hf = (HiddenField)repeaterItem.FindControl("editAdminEmail");
于 2010-12-14T04:29:02.117 回答