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はnullになります。私は何が間違っているのですか?

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

終わり...


すべてのRepeaterItemを反復処理するには、リピーターの外側にボタンを配置できます(または、フッターなどにボタンを配置できます。これはリピーターの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

もう1つ、編集ボタンの制御下でカプセル化されていない可能性があります。

たとえば、findcontrolメソッドが機能するには次のようになります。

<asp:button id = "AdminEdit" runat = "server" onclick ....>
   <!-ボタンの内側(カプセル化)に隠しフィールドコントロールを配置します。->
   <asp:HiddenField ID = "editAdminEmail" runat = "server" Value ='<%#Eval( "emailAddress")%>' />
</ asp:button>

AdminEdit.Controlsはコントロールのコンテナーであるため、これで、そのコントロールを第1レベルの子として見つけることができるはずです。ボタンの子でない場合は、子にするか、別の方法で参照する必要があります。これは、動的に生成されたコントロールに特に当てはまります。つまり...それはどのコントロールまたはルート要素の子ですか?

于 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が指摘しているように、リピーターアイテムレベルで検索する必要があります。リンクボタンはどこにありますか?私はそれがリピーター自体の中にあるべきだと信じています(そうでなければ、複数の隠しフィールド(リピーターの行ごとに1つ)を持つことができ、リンクボタンで拾うことになっていますか?)。したがって、リンクボタンと非表示フィールドの両方がリピーターにある場合は、次のようなコードを使用できます

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 に答える