ASP.ネット:私のボタンのクリック/コマンドイベントがリピーターでバインド/起動されないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/42396

質問

リピーターを含む 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

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

役に立ちましたか?

解決

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

ItemCommand 含まれています RepeaterCommandEventArgs これには 2 つの重要なフィールドがあります。

  • コマンド名
  • コマンド引数

それで、簡単な例:

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

他のヒント

対処する必要があります アイテムコマンドイベント リピーターで。こちらです .

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

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 に移動すると役に立ちました。

ここでは、試してみる実験を示します。

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

これの何がイライラするか知っていますか?

その asp:Button タグで OnClick を指定すると、ビルド 意思 指定されたメソッドが分離コード クラスに存在することを確認し、存在しない場合はエラーを報告します...たとえそのメソッドが呼び出されないとしても。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top