0

C# バックエンドを使用して ASP.NET Web サイトを開発しています。ログインビューとリピーターの両方の内部にネストされたボタンの onclick イベントを設定する方法に問題があります。コードは他のすべてのデータを表示するために正常に機能します (匿名ビューにはエラー メッセージのみが表示されます) が、現在、ボタンは同じページにリダイレクトされ、リピーターとすべてのコンテンツが削除されますが、特定の削除機能を実行することになっています。 . リピーターは、現在のように、alternativeitem テンプレートを使用しています。ネストされたコントロールからボタンを削除すると、機能します。ボタン、リンクボタン、イメージボタンでこれを試しました。できれば後者を使いたいです。このようにネストされている場合、これらのボタンに Onclick を割り当てることは可能ですか? そうでない場合、どのアプローチを使用する必要がありますか?

<asp:LoginView ID="LoginLinksView" runat="server" EnableViewState="false">
<AnonymousTemplate>
    <asp:Label ID="errorlabel" runat="server"></asp:Label>
</AnonymousTemplate>
<LoggedInTemplate>
    <asp:Repeater id="Repeater" runat="server" >
    <HeaderTemplate>
     <table cellspacing="0" cellpadding="0">
     <thead></thead>
    </HeaderTemplate>
    <ItemTemplate>
    <tr class="Repeaterrow">
    <!--Additional code here-->

    <asp:ImageButton ID="delbutton" runat="server" ImageUrl=
         "~/Images/delete.png" Onclick="DeleteOnClick"/>        
    </tr> 
    </ItemTemplate>   

    <AlternatingItemTemplate>
    <tr class="Repeaterrow">
    <!--Additional code here-->

    <asp:ImageButton ID="delbutton" runat="server" ImageUrl=
         "~/Images/delete.png" Onclick="DeleteOnClick"/>             
    </tr>
    </AlternatingItemTemplate>

    <FooterTemplate>  
    </table>
    </FooterTemplate>

    </asp:Repeater>
</LoggedInTemplate>
</asp:LoginView>
4

1 に答える 1

1

ここにあなたのアプローチの問題があります

1-ボタンはポストバックを発行します。ただし、「キー」または処理対象の行を識別するために、いくつかの CommandArgument を配置する必要があります。

2-リピーターをソースに再バインドします。以下はサンプルコードです。

protected void Page_Load(object sender, EventArgs e)
{
    BindRepeater();
}

private void BindRepeater()
{
    List<int> items = new List<int>();
    for (int i = 0; i < 10; i++)
    {
        items.Add(i);
    }
    Repeater.DataSource = items;
    Repeater.DataBind();
}
protected void DeleteOnClick(object sender, EventArgs e)
{
    ImageButton delbutton = (sender as ImageButton);
    //1- call your method with passing in delbutton.CommandArgument - it will give you key/ whatever you like
    //2- Rebind the Repeater here and that will bind controls again...
    BindRepeater();
}
protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    ImageButton delbutton = (sender as RepeaterItem).FindControl("delbutton") as ImageButton;
    if (delbutton != null)
    {
        delbutton.CommandArgument = (sender as RepeaterItem).ItemIndex.ToString();
    }
}

ASPX Repeater の定義は次のように変更されます。

ありがとう、リズ

于 2013-05-29T20:00:52.133 に答える