ASP.ネット:私のボタンのクリック/コマンドイベントがリピーターでバインド/起動されないのはなぜですか?
質問
リピーターを含む 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 を指定すると、ビルド 意思 指定されたメソッドが分離コード クラスに存在することを確認し、存在しない場合はエラーを報告します...たとえそのメソッドが呼び出されないとしても。