9

リピーターを持つascxのコードは次のとおりです。

<asp:Repeater ID="ListOfEmails" runat="server" >
    <HeaderTemplate><h3>A sub-header:</h3></HeaderTemplate>
    <ItemTemplate>
        [Some other stuff is here]
        <asp:Button ID="removeEmail" runat="server" Text="X" ToolTip="remove" />
    </ItemTemplate>
</asp:Repeater>

そして、リピーターのデータバウンドとイベントのコードビハインド:

Protected Sub ListOfEmails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles ListOfEmails.ItemDataBound
    If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
        Dim removeEmail As Button = CType(e.Item.FindControl("removeEmail"), Button)
        removeEmail.CommandArgument = e.Item.ItemIndex.ToString()

        AddHandler removeEmail.Click, AddressOf removeEmail_Click
        AddHandler removeEmail.Command, AddressOf removeEmail_Command
    End If
End Sub

Sub removeEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Response.Write("<h1>click</h1>")
End Sub

Sub removeEmail_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
    Response.Write("<h1>command</h1>")
End Sub

クリックもコマンドも呼び出されません。何が間違っているのでしょうか。

4

5 に答える 5

15

リピーター内にネストされたコントロールは、イベントをインターセプトしません。Repeater.ItemCommand代わりに、イベントにバインドする必要があります。

ItemCommandRepeaterCommandEventArgs2つの重要なフィールドがあるが含まれています。

  • CommandName
  • CommandArgument

したがって、簡単な例:

void rptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        // Stuff to databind
        Button myButton = (Button)e.Item.FindControl("myButton");

        myButton.CommandName = "Add";
        myButton.CommandArgument = "Some Identifying Argument";
    }
}

void rptr_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "Add")
    {
        // Do your event
    }
}
于 2008-09-03T19:48:16.547 に答える
4

リピーターでItemCommandイベントを処理する必要があります。これが例です。

次に、ボタンのクリックはListOfEmails_ItemCommandメソッドによって処理されます。ItemDataBoundの(ボタンの)ClickまたはCommandイベントの配線は機能しないと思います。

于 2008-09-03T19:51:47.537 に答える
2

ItemCommand イベントを使用する場合は、Page_Load ではなく、Page_Init で ItemCommand イベントに登録してください。

protected void Page_Init(object sender, EventArgs e)
{
    // rptr is your repeater's name
    rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}

このイベントが Page_Load に登録されていてうまくいかなかった理由はわかりませんが、Page_Init に移動すると役に立ちました。

于 2011-02-14T18:55:47.903 に答える
0

これがあなたが試すための実験です:

ListOfEmails_ItemDataBoundにブレークポイントを設定し、ポストバックのために呼び出されているかどうかを確認します。

于 2008-09-03T19:46:12.247 に答える
0

あなたはこれについて何がイライラしているのか知っていますか?

そのasp:ButtonタグでOnClickを指定すると、ビルドは指定されたメソッドがcodebehindクラスに存在することを確認し、存在しない場合はエラーを報告します...そのメソッドが呼び出されることはありません。

于 2010-11-18T22:08:56.690 に答える