ASP.Net:perché è il mio click del pulsante di comando/eventi non vincolante/cottura di un ripetitore?

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

Domanda

Ecco il codice da ascx che ha il ripetitore:

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

E nel code-behind per il ripetitore con associazione a dati e fatti:

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

Né il click o il comando è sempre chiamato, che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Controlli nidificato all'interno di Ripetitori non intercettare gli eventi.Invece è necessario associare il Repeater.ItemCommand Evento.

ItemCommand contiene RepeaterCommandEventArgs che ha due importanti settori:

  • Nomecomando
  • CommandArgument

Così, un banale esempio:

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

Altri suggerimenti

È necessario gestire il Evento ItemCommand sul Ripetitore.Ecco un esempio.

Quindi, il vostro clic del pulsante verrà gestito dal ListOfEmails_ItemCommand metodo.Non credo che il cablaggio del Click o evento di Comando (pulsante) in ItemDataBound di lavoro.

Se hai intenzione di usare evento ItemCommand, assicurarsi che si registra per l'evento ItemCommand nel Page_Init non nel Page_Load.

protected void Page_Init(object sender, EventArgs e)
{
    // rptr is your repeater's name
    rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}

Io non sono sicuro perché non era il lavoro per me, con questo evento registrato nel Page_Load, ma spostando Page_Init aiutato.

Ecco un esperimento per provare:

Impostare un punto di interruzione ListOfEmails_ItemDataBound e vedere se questo viene chiamato per il postback.

Sai cosa è frustrante su questo?

Se si specifica un OnClick in asp:Button tag, la build sarà verificare che il metodo esiste nel codebehind della classe, e segnalare un errore se non...anche se questo metodo non viene mai chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top