none
ImageButton dans repeater RRS feed

  • Question

  • Bonjour

     

    Dans la realisation d'un repeater j'ai en itemTemplate deux imageButtons

     

    code

    <asp:Repeater ID="rt" runat="server" onitemcommand="rt_ItemCommand"

    onitemcreated="rt_ItemCreated">

    <ItemTemplate>

    <div>

    <div>

    <p><%#Eval("Auteur")%></p>

    <p><%#Utility.Utils.LangueToString(Eval("Langue"))%></p>

    <p><%#Utility.Utils.CoefficientToString(Eval("Coefficient"))%></p>

    <p><%#Utility.Utils.AffichageToString(Eval("Affichage"))%></p>

    <p><%#Eval("DateCreation", "{0Big Smiled/MM/yyyy}")%></p>

    </div>

    <div><%#Eval("Texte")%></div>

    <p><asp:ImageButton ID="ibtn1" runat="server" ImageUrl="~/Images/modifier-115.png" CommandName="Update" CommandArgument='<%#Eval("CitationID")%>'/> <asp:ImageButton ID="ibtn2" runat="server" ImageUrl="~/Images/supprimer-115.png" CommandName="Supprime" CommandArgument='<%#Eval("NumCitation")%>' /></p>

    </div>

    </ItemTemplate>

    </asp:Repeater>

     

    dans mon code de traitement

    protected void rt_ItemCommand(object source, RepeaterCommandEventArgs e)

    {

    switch (e.CommandName)

    {

    case "Supprime":

    Citations.Delete(Convert.ToInt32(e.CommandArgument));

    break;

    case "Update":

    break;

    }

    }

     

    et lors de mon test sur le click d'un des items de mon repeater j'ai cette erreur ,que je incapable de resoudre

    Argument de publication ou de rappel non valide. La validation d'événement est activée via <pages enableEventValidation="true"/> dans la configuration ou via <%@ Page EnableEventValidation="true" %> dans une page. Pour des raisons de sécurité, cette fonctionnalité vérifie si les arguments des événements de publication ou de rappel proviennent du contrôle serveur qui les a rendus à l'origine. Si les données sont valides et attendues, utilisez la méthode ClientScriptManager.RegisterForEventValidation afin d'inscrire les données de publication ou de rappel pour la validation.

     

    j'ai regardé effectivement en clientScriptManager

    Cordialement

     

    mercredi 26 mars 2008 18:00

Réponses

  • Bonjour,

    Le message d'erreur vient du fait que lors du raise de l'évènement votre controle ImageButton n'existe pas dans la liste des controles présent dans la page lors du postback. Il y a donc une erreur de validation.

    Le plus simple pour ne plus avoir ce problème est de vous assurer que tous vos controles soient bien recrée avant le raise. Pour cela il faut que vous rebindez votre Repeater dans la méthode OnInit ou OnInitComplete. Cela entrainera la création des controles ImageButton et la validation passera.

    Ci dessous un petit exemple :

     

    Code Snippet

    ASPX

     

    <asp:Repeater ID="rt" runat="server" OnItemCommand="OnItemCommandHandler">

    <ItemTemplate>

    <div style="border: solid 2px #f00;">

    <asp:ImageButton ID="ib1" runat="server" ImageUrl="~/32.png" CommandName="Update" CommandArgument='<%# Eval("Id") %>' />

    <asp:ImageButton ID="ib2" runat="server" ImageUrl="~/32.png" CommandName="Supprime" CommandArgument='<%# Eval("Num") %>' />

    </div>

    </ItemTemplate>

    </asp:Repeater>

    <asp:Label ID="lbl" runat="server" />

     

    C#

     

    protected override void OnInitComplete(EventArgs e)

    {

    base.OnInitComplete(e);

     

    this.rt.DataSource = this.GetData();

    this.rt.DataBind();

    }

     

    protected void OnItemCommandHandler(object source, RepeaterCommandEventArgs e)

    {

    switch (e.CommandName)

    {

    case "Update":

    this.lbl.Text = "UPDATE: " + e.CommandArgument;

    break;

     

    case "Supprime":

    this.lbl.Text = "DELETE: " + e.CommandArgument;

    break;

    }

    }

     

    private List<Data> GetData()

    {

    List<Data> data = new List<Data>();

    data.Add(new Data(1, 10));

    data.Add(new Data(2, 20));

    data.Add(new Data(3, 30));

     

    return data;

    }

     

    class Data

     

    public class Data

    {

    private int m_id;

    private int m_num;

     

    public Data(int id, int num)

    {

    this.m_id = id;

    this.m_num = num;

    }

     

    public int Id

    {

    get { return this.m_id; }

    }

     

    public int Num

    {

    get { return this.m_num; }

    }

    }

     

     

    Dans mon exemple le binding est toujours dans dans OnInitComplete mais vous pourriez si vous voulez ne le faire à cet endroit que lors d'un postback (en testant IsPostBack) et lors du premier appel le faire ailleur.

     

    Guillaume

    jeudi 27 mars 2008 09:49
  • je te remercie pour ton aide

     

    cela marche a merveille

    jeudi 27 mars 2008 16:07

Toutes les réponses

  • Bonjour,

    Le message d'erreur vient du fait que lors du raise de l'évènement votre controle ImageButton n'existe pas dans la liste des controles présent dans la page lors du postback. Il y a donc une erreur de validation.

    Le plus simple pour ne plus avoir ce problème est de vous assurer que tous vos controles soient bien recrée avant le raise. Pour cela il faut que vous rebindez votre Repeater dans la méthode OnInit ou OnInitComplete. Cela entrainera la création des controles ImageButton et la validation passera.

    Ci dessous un petit exemple :

     

    Code Snippet

    ASPX

     

    <asp:Repeater ID="rt" runat="server" OnItemCommand="OnItemCommandHandler">

    <ItemTemplate>

    <div style="border: solid 2px #f00;">

    <asp:ImageButton ID="ib1" runat="server" ImageUrl="~/32.png" CommandName="Update" CommandArgument='<%# Eval("Id") %>' />

    <asp:ImageButton ID="ib2" runat="server" ImageUrl="~/32.png" CommandName="Supprime" CommandArgument='<%# Eval("Num") %>' />

    </div>

    </ItemTemplate>

    </asp:Repeater>

    <asp:Label ID="lbl" runat="server" />

     

    C#

     

    protected override void OnInitComplete(EventArgs e)

    {

    base.OnInitComplete(e);

     

    this.rt.DataSource = this.GetData();

    this.rt.DataBind();

    }

     

    protected void OnItemCommandHandler(object source, RepeaterCommandEventArgs e)

    {

    switch (e.CommandName)

    {

    case "Update":

    this.lbl.Text = "UPDATE: " + e.CommandArgument;

    break;

     

    case "Supprime":

    this.lbl.Text = "DELETE: " + e.CommandArgument;

    break;

    }

    }

     

    private List<Data> GetData()

    {

    List<Data> data = new List<Data>();

    data.Add(new Data(1, 10));

    data.Add(new Data(2, 20));

    data.Add(new Data(3, 30));

     

    return data;

    }

     

    class Data

     

    public class Data

    {

    private int m_id;

    private int m_num;

     

    public Data(int id, int num)

    {

    this.m_id = id;

    this.m_num = num;

    }

     

    public int Id

    {

    get { return this.m_id; }

    }

     

    public int Num

    {

    get { return this.m_num; }

    }

    }

     

     

    Dans mon exemple le binding est toujours dans dans OnInitComplete mais vous pourriez si vous voulez ne le faire à cet endroit que lors d'un postback (en testant IsPostBack) et lors du premier appel le faire ailleur.

     

    Guillaume

    jeudi 27 mars 2008 09:49
  • je te remercie pour ton aide

     

    cela marche a merveille

    jeudi 27 mars 2008 16:07