2008-09-03 12 views
9

Hier ist der Code aus dem ascx, dass der Repeater hat:ASP.Net: Warum sind die Click/Command-Ereignisse meiner Taste nicht bindend/in einem Repeater feuernd?

<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 in der Code-Behind-Databound und Veranstaltungen für die 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 oder Befehl wird immer genannt, was bin ich falsch machen?

Antwort

15

Steuerelemente, die innerhalb von Repeatern verschachtelt sind, fangen keine Ereignisse ab. Stattdessen müssen Sie an das Repeater.ItemCommand-Ereignis binden.

ItemCommand enthält RepeaterCommandEventArgs die zwei wichtige Felder hat:

  • Command
  • Command

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

EDIT: Abschriften total abgespritzt meine Einbuchtung Naja, ich sollte aufhören, Code in th zu schreiben Ist sowieso Textbox.

0

Hier ist ein Experiment für Sie versuchen:

einen Haltepunkt auf ListOfEmails_ItemDataBound und sehen, ob es für Postbacks genannt wird.

+1

warum? Könnten Sie das näher ausführen? Ich glaube nicht, dass dies eine "Antwort" ist. Vielleicht hättest du das lieber als "Kommentar" hinzufügen sollen. – hofnarwillie

4

Sie müssen mit dem ItemCommand event auf Ihrem Repeater umgehen. Hier ist an example.

Dann werden Ihre Tastenklicks von der ListOfEmails_ItemCommand-Methode behandelt. Ich glaube nicht, dass das Click- oder Command-Event (der Button) in ItemDataBound funktioniert.

0

Sie wissen, was daran frustrierend ist?

Wenn Sie eine OnClick in diesem asp angeben: Button-Tag, wird der Build überprüfen, ob die benannte Methode in der Code-Behind-Klasse vorhanden ist, und einen Fehler melden, wenn es nicht der Fall ist ... obwohl diese Methode wird nie gerufen werden.

2

Wenn Sie das ItemCommand-Ereignis verwenden möchten, müssen Sie sich im 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 nicht sicher, warum es nicht mit dieser Veranstaltung für mich arbeitet in Page_Load registriert, aber es half Page_Init bewegen.