2009-04-06 5 views
3

Ich habe Probleme mit dem Befehl Ereignisargumente nach dem zweiten Klick mit dem folgenden Code.Problem, commandeventargs in Befehlsereignis nach dem Neuerstellen der Steuerelemente in Postback

so - wenn ich einen Knopf klicke, und einen neuen Knopf erzeuge, um den zu ersetzen, der dort war, verliere ich den viewstate auf dem folgenden Knopfklick.

Irgendwelche Vorschläge, was ich tun muss, um dies zum Funktionieren zu bringen? Ich kann die Struktur nicht wesentlich ändern, da ich eine variable Anzahl von völlig unbezogenen Knöpfen im Befehlshandler erzeugen muss.

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(); 
    } 
} 

Antwort

5

Dies passiert, weil Ihr Panel ein wörtliches Steuerelement enthält. Wenn Sie Ihre Schaltfläche das erste Mal hinzufügen, ist es (die Schaltfläche) ein zweites Steuerelement. Wenn Sie später die Steuerelementsammlung des Steuerfelds löschen, wird es zum ersten Steuerelement, und der Ansichtsstatus wird für das erste Steuerelement gespeichert, das beim folgenden Postback zum Literal wird.

Konvertieren Sie

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

zu

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

und es wird funktionieren.

+0

danke - ich glaube nicht, dass ich jemals daran gedacht hätte. Hoffentlich ist das ähnlich wie in meinem realen Projekt. – dice

0

Sie haben vergessen, die CommandArgument Eigenschaft setzen, wenn Sie auf die Schaltfläche in Page_Load neu erstellen.

+0

Keine Notwendigkeit dafür. Das CommandArgument wird in einem Ansichtszustand beibehalten. Das Problem ist ein Vorhandensein eines wörtlichen und Änderung der Tastenposition in der Steuerelemente Sammlung – Ruslan