Legen Sie Textfelder in ein Repeater dynamisch und abrufen Ihrer Wert
Habe ich einen Repeater gebunden von SQL, mit einer Mischung von editierbaren und schreibgeschützten Elementen. Wenn du auf den "Bearbeiten" - Taste auf einer Zeile, die Bearbeitbare Portionen umrechnen sollten, um die Textfelder, und wenn Sie klicken Sie auf "Update", sollte es Ihre änderungen zu speichern.
Hier ist eine (sehr) vereinfachte version der Edit-und Update-Button " OnClick code:
switch(commandName)
{
case "Edit":
Label1.Visible = false; //hide read-only version
PlaceHolder1.Visible = true; //show editing version
//Dict1 is Dictionary<string, string> in this example.
foreach (var key in Dict1)
{
//insert a TextBox dynamically into the PlaceHolder
PlaceHolder1.Controls.Add(new TextBox
{
ID = "txt" + key,
Text = Dict1[key]
});
}
break;
case "Update":
//retrieve user input from dynamically-added TextBoxes
foreach (var TextBox1 in PlaceHolder1.Controls.Where(c => c.ID.StartsWith("txt")))
{
doStuff(TextBox1);
}
Label1.Visible = true; //show read-only version
PlaceHolder1.Visible = false; //hide editing version
break;
}
Das problem ist, dass meine dynamisch hinzugefügte Textfelder gibt es nicht, wenn die Seite Beiträge zurück. Ich habe untersucht PlaceHolder1.Controls
im debugger, und es gibt keine Textboxen in es. PlaceHolder1
selbst ist im inneren ein Repeater, aber ich bin nicht neubindung der Repeater auf PostBack.
Habe ich mir überlegt mit raw HTML anstelle von TextBox-Steuerelemente und ziehen Sie die Werte aus der Anfrage.Form, aber das fühlt sich hackish zu mir. Wie kann ich das dynamisch hinzugefügte Textfelder persistent über postbacks?
EDIT:
Gibt es einige Komplikationen hier, dass es schwer ist zu zeigen, ohne eine Tonne von Beispiel-code. Hier sind die großen:
- Jede Zelle in dem repeater eine Mischung von nur-lese-und bearbeitbaren text (D. H., die dynamisch eingefügten Beschriftungen und Textfelder)
- Ich weiß nicht, wie viele Bearbeitbare Bereiche werden in jeder Zelle. Der original-text Aussehen könnte
blah blah @A1@ blah blah @A2@ blah...
, und ich würde zu legen Sie den Ersatz-text an Stelle von @A1@, @A2@, usw. Im edit-Modus, nur, dass der Ersatz der text kann bearbeitet werden.
- By the way, ist dieses stark vereinfachte Beispiel-code. Ich weiß nicht wirklich geben meine Steuerelemente Namen wie
Label1
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie fügen Sie Steuerelemente dynamisch, Sie sind nicht erhalten über postbacks. Sie haben, um Sie hinzuzufügen, um die Seite wieder nach dem postback. Ich in der Regel tun es in Page_Load. Dann, sobald Sie Hinzugefügt werden, und Ihre postback-Staaten wird korrekt wiederhergestellt, die später in der ASP.NET Seite-Lebenszyklus.
So,
Hoffe, das hilft!
Eine mögliche Antwort wäre, die TEXTBOX pre-definiert in der ARTIKEL-VORLAGE, und dann nur seine' Sichtbarkeit für die gegebene Zeile auf das click-Ereignis.
Eine zweite Möglichkeit wäre, umgestalten, den repeater zu nutzen, kann das GRIDVIEW-Steuerelement statt. Es unterstützt editierbaren Vorlagen aus der box.
Egal, was passiert, ist, dass da diese Steuerelemente werden dynamisch Hinzugefügt, Sie sind nicht immer neu, auf die nächste postback. Auf dem postback, Sie müssen neu erstellen Sie die Steuerelemente, wenn Sie darauf zugreifen wollen. ABER, vergessen Sie nicht, dass der Wert gespeichert WIRD, in der form Kollektion: