2009-04-06 3 views
3

Je rencontre des problèmes pour obtenir les arguments de l'événement de commande après le second clic en utilisant le code ci-dessous. Donc quand je clique sur un bouton, et que je crée un nouveau bouton pour remplacer celui qui était là, je perds l'état de vue au prochain clic sur le bouton.Problème lors de l'obtention de commandeventargs dans l'événement de commande après la création de contrôles dans la publication

Des suggestions sur ce que je dois faire pour que cela fonctionne? Je ne peux pas modifier de manière significative la structure car je dois générer un nombre variable de boutons totalement non liés dans le gestionnaire de commandes.

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      LinkButton btn = new LinkButton(); 
      btn.ID = "btn1"; 
      this.Panel1.Controls.Add(btn); 
      btn.Command += new CommandEventHandler(myLinkButton_Command);   
     } 
     else 
     { 
      LinkButton btn = new LinkButton(); 
      btn.ID = "btn1"; 
      this.Panel1.Controls.Add(btn); 
      btn.Text = "My Button 1"; 
      btn.CommandArgument = "1"; 
      btn.Command += new CommandEventHandler(myLinkButton_Command); 
     } 
    } 

    void myLinkButton_Command(object sender, CommandEventArgs e) 
    { 
     int newArg = Convert.ToInt32(e.CommandArgument) + 1;// empty string on second mouse click 
     this.Panel1.Controls.Clear(); 
     LinkButton myLinkButton = new LinkButton();   
     myLinkButton.ID = "btn1"; 
     this.Panel1.Controls.Add(myLinkButton); 
     myLinkButton.Text = "My Button " + newArg.ToString(); 
     myLinkButton.CommandArgument = newArg.ToString(); 
    } 
} 

Répondre

5

Cela se produit parce que votre panneau contient un contrôle littéral. Lorsque vous ajoutez votre bouton la première fois, il (le bouton) est un second contrôle. Lorsque vous effacerez plus tard la collection de contrôles du panneau, celle-ci devient le premier contrôle et l'état viewstate est enregistré pour le premier contrôle, ce qui à la publication suivante devient le littéral.

convertir simplement

<asp:Panel ID="Panel1" runat="server"> 
</asp:Panel> 

à

<asp:Panel ID="Panel1" runat="server" /> 

et cela fonctionnera.

+0

merci - je ne pense pas que j'aurais jamais pensé à cela. J'espère que cela ressemble à ce qui se passe dans mon vrai projet. – dice

0

Vous avez oublié de définir la propriété CommandArgument lorsque vous recréez le bouton Page_Load.

+0

Pas besoin de ça. L'objet CommandArgument est conservé dans un état d'affichage. Le problème est une présence d'un littéral et le changement de la position des boutons dans la collection de contrôles – Ruslan

Questions connexes