ASP.Net:Warum werden die Klick-/Befehlsereignisse meiner Schaltfläche nicht in einem Repeater gebunden/ausgelöst?

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

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top