2011-01-07 12 views
2

Ich erstelle dynamische TextBoxes in einer Seite, indem ich auf einen LinkButton klicke.Dynamische TextBox auf LinkButton klicken

Allerdings, wenn die Seite gesendet wird, kann ich nicht finden, die Elemente dynamisch erstellt, daher kann die Informationen nicht an die Datenbank senden.

protected void lbAddTag_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 3;i++) 
    { 
     CreateTextBox("txtTag-" + i.ToString()); 
    } 

} 

private void CreateTextBox(string ID) 
{ 
    TextBox txt = new TextBox(); 
    txt.ID = ID; 
    txt.Width = Unit.Pixel(300); 
    //txt.TextChanged += new EventHandler(OnTextChanged); 
    txt.AutoPostBack = false; 
    tagsPanel.Controls.Add(txt); 

    Literal lt = new Literal(); 
    lt.Text = "<br /><br />"; 
    tagsPanel.Controls.Add(lt); 
} 

Wenn ich gesagt:

foreach (Control c in tagsPanel.Controls) 
{ 
    if (c is TextBox) 
    { 
     lblError.Text += c.ClientID + " , "; 
    } 
} 

im lbAddTag_Click Methode, die ich die Einzelteile sehen, und sie existieren, aber wenn ich die Seite einreichen und versuchen, die Werte in der Datenbank nichts einfügen .. .

Jeder Hinweis wird sehr geschätzt.

Antwort

1

Wenn Sie Steuerelemente dynamisch erstellen, werden sie bei einer Übergabe nicht in der Steuerungshierarchie/dem Ansichtsstatus beibehalten.

prüfen Sie diesen Artikel: http://www.4guysfromrolla.com/articles/092904-1.aspx

Ich würde lieber eine Repeater Kontrolle hat und dann eine Arraylist in der Sitzung zu erhalten und zu verwenden, die als Datasource Control Repeater. Wenn ich eine Zeile hinzufügen möchte, würde ich lieber eine Zeile zur ArrayList in der Sitzung hinzufügen und das Repeater-Steuerelement erneut binden. Lassen Sie mich wissen, wenn Sie ein Beispiel brauchen.

+0

Dank cybermate, verstehe ich jetzt. Wenn Sie ein Beispiel geben können, wäre es großartig. Ich lese die 4guysfromrolla Beitrag jetzt –

+0

Ich habe eine grobe Probe bei Pastebin veröffentlicht. Überprüfen Sie diese URL: http://pastebin.com/dwqHDTUC – Chandu

+0

vielen Dank. werde das ausprobieren –

1

Page Life Cycle Zeug ist wirklich schwierig in ASP.NET. Sie müssen sicherstellen, dass die LinkButtons auf die gleiche Weise erstellt werden, bevor der Lebenszyklus versucht, ihre Ansichtszustände zu laden. Der beste Weg, dies zu tun, besteht wahrscheinlich darin, das Control/die Seite so einzurichten, dass beim Speichern von ViewState zunächst Informationen über die von Ihnen erstellten Textfelder in ViewState hinzugefügt werden. Erstellen Sie anschließend unmittelbar nach dem Laden von ViewState die Textfelder basierend auf diesen Informationen. Sie können dies tun, indem Sie die Methoden SaveViewState und LoadViewState überschreiben.

1

Sie müssen jedes dynamische Steuerelement auf Postback neu erstellen, andernfalls können ihre Werte nicht von ViewState neu erstellt werden. Sie müssen also die Anzahl Ihrer Textboxen speichern (z. B. als ViewState-Variable). Sie müssen die gleiche ID erhalten, also sollten Sie den Zähler als Suffix von der ID verwenden (zB TextBox_4).

1

Die Controls-Auflistung ist eine Baumstruktur. Steuerelemente enthalten andere Steuerelemente, so dass es möglicherweise über 1 Steuerfeld verfügt, das mehrere andere Steuerfelder enthält und die die TextBox enthalten, die Sie suchen. Sie müssen rekursiv durch die Kontrollen gehen.

Schauen Sie sich das http://msdn.microsoft.com/en-us/library/486wc64h.aspx

Oder diese:

public delegate void control_visitor(Control control); 

public void iterate_controls(ControlCollection controls, control_visitor visitor) 
{ 
    foreach (Control control in controls) 
    { 
     visitor(control); 
     iterate_controls(control.Controls, visitor); 
    } 
} 
+0

Hallo Zac. Mein Problem bezieht sich nicht auf die Iteration der Steuerelemente. Ich habe verstanden, wie das gemacht wird und tat es. Das Problem besteht darin, dass die Steuerelemente im Viewstatus nicht bestehen, nachdem ich die Seite gesendet habe. Danke Alex –

Verwandte Themen