2009-04-17 10 views
1


Warum Kontrollen zu tun bekommen mit Postback Daten gefüllt zweimal - während LoadPostBack und während

Kontrollen mit Postbackdaten während LoadPostBack Daten Bühne bestückt sind. Wenn kein dynamisches Steuerelement erstellt und während OnInit Stadium, aber später hinzugefügt wird, wird Steuerelement nicht mit Postback-Daten aufgefüllt, wie in dem folgenden Code ersichtlich ist, wobei Label1 eine leere Zeichenfolge anzeigen wird:


public partial class _Default : System.Web.UI.Page 
{ 
    TextBox textB; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     textB = new TextBox(); 
     textB.ID = "dynamicTextC"; 
     Panel1.Controls.Add(textB); 
     Label1.Text = textB.Text; // displays an empty string 
    } 


Aber wenn ich setzen Label1.Text = textB.Text; innerhalb Ereignishandler subscribe to TextB TextChanged Ereignis, dann Label1 wird angezeigt Text Benutzer eingegeben in TextB. Nun wird vorgeschlagen, dass die Steuerelemente zweimal mit den gleichen Postback-Daten gefüllt werden - während der LoadPostBack-Datenstufe und während Raise Postback Events stage. Warum muss die Kontrolle zweimal mit denselben Postback-Daten gefüllt werden?

BTW - ich merke, dass während Raise Postback-Events Bühne Steuerpostbacks Wert vergleicht der vorherigen Seite Lastwert auf Postback und entscheidet dann, ob Ereignis ausgelöst werden muss


TextBox textB; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     textB = new TextBox(); 
     textB.ID = "dynamicTextC"; 
     Panel1.Controls.Add(textB); 

     textB.TextChanged += textB_TextChanged;   
    } 


    protected void textB_TextChanged(object sender, EventArgs e) 
    { 
     Label1.Text = textB.Text; // Label1 displays value user 
            entered into textB 
    } 


danke


EDIT:

Das Steuerelement wird erstellt erhalten und wird Teil der Ansichtszustand sein (da es sich um eine serverseitige Kontrolle ist. Daher brauchen sie nicht wieder auf Postback erstellt werden)

Das ist nicht das, was auf einem Postbacks, zumindest in meinem Fall TextBox verschwindet passiert.

Antwort

1

Ich glaube, Sie diesen Code unter der Kontrolle setzen sollte

 
if (!IsPostBack) 
{ 
textB = new TextBox(); 
textB.ID = "dynamicTextC"; 
Panel1.Controls.Add(textB) 
}

EDIT:. Die Steuerung erstellt erhalten und wird Teil der Ansichtszustand sein (da es sich um eine serverseitige Steuerung ist also es muss nicht sein erstellt wieder auf Postbacks)

Probieren sie den HTML-Markup zu sehen, es erzeugt, wenn die Seite zum ersten Mal & beim nächsten Mal zu verstehen, den Markup-Text für „dynamicTextC“ geladen wird.

+0

Ich verstehe nicht. Warum sollte ich es in die "if" -Anweisung einfügen? – SourceC

+0

Ahhh, das gefürchtete if (! IsPostBack). Gott, ich bin froh, dass ich MVC jetzt benutze. – mmcdole

0

Haben Sie einen bestimmten Grund, warum Sie das dynamische Steuerelement nicht in Page_Init erstellen möchten?Dieser Code scheint zu funktionieren:

protected void Page_Init(object sender, EventArgs e) { 
    textB = new TextBox(); 
    textB.ID = "dynamicTextC"; 
    Panel1.Controls.Add(textB); 
    } 


    protected void Page_Load(object sender, EventArgs e) { 
    Label1.Text = textB.Text; 
    } 
+0

Ich weiß, dass der obige Code funktionieren würde. Aber meine Frage war mehr darüber, was unter der Haube passiert und warum die Kontrollen zweimal mit Postback-Daten gefüllt werden – SourceC

Verwandte Themen