ASP.Net:Warum werden die Klick-/Befehlsereignisse meiner Schaltfläche nicht in einem Repeater gebunden/ausgelöst?
Frage
Hier ist der Code vom ASCX, der den Repeater hat:
<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>
Und im CodeBehind für die Datenbindung und Ereignisse des Repeaters:
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
Weder der Klick noch der Befehl werden aufgerufen. Was mache ich falsch?
Lösung
Innerhalb von Repeatern verschachtelte Steuerelemente fangen keine Ereignisse ab.Stattdessen müssen Sie sich an das binden Repeater.ItemCommand
Ereignis.
ItemCommand
enthält RepeaterCommandEventArgs
das zwei wichtige Felder hat:
- Befehlsname
- CommandArgument
Also ein triviales Beispiel:
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
}
}
Andere Tipps
Sie müssen damit umgehen ItemCommand-Ereignis auf Ihrem Repeater.Hier ist ein Beispiel.
Anschließend werden Ihre Schaltflächenklicks von der ListOfEmails_ItemCommand-Methode verarbeitet.Ich glaube nicht, dass die Verkabelung des Click- oder Command-Ereignisses (der Schaltfläche) in ItemDataBound funktionieren wird.
Wenn Sie das ItemCommand-Ereignis verwenden möchten, stellen Sie sicher, dass Sie das ItemCommand-Ereignis in Page_Init und nicht in Page_Load registrieren.
protected void Page_Init(object sender, EventArgs e)
{
// rptr is your repeater's name
rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}
Ich bin mir nicht sicher, warum es bei mir nicht funktioniert hat, als dieses Ereignis in Page_Load registriert wurde, aber es hat geholfen, es nach Page_Init zu verschieben.
Hier ist ein Experiment, das Sie ausprobieren können:
Legen Sie einen Haltepunkt für ListOfEmails_ItemDataBound fest und prüfen Sie, ob er für Postbacks aufgerufen wird.
Wissen Sie, was daran frustrierend ist?
Wenn Sie in diesem asp:Button-Tag einen OnClick angeben, wird der Build Wille Überprüfen Sie, ob die benannte Methode in der Codebehind-Klasse vorhanden ist, und melden Sie einen Fehler, wenn dies nicht der Fall ist ...auch wenn diese Methode nie aufgerufen wird.