C# Dynamisch erstellte Textboxen -> Status abfragen

apolyton

Lt. Junior Grade
Registriert
Nov. 2007
Beiträge
390
Hallo,

ich arbeite an einem Tool, wo ich u.a. mit Hilfe eines Wizards Daten verarbeite. In einem Schritt erzeuge ich so viele Textboxen, wie der Anwender angibt. Im nächsten Schritt möchte ich den Inhalt der dynamisch erstellten Textboxen abfragen. Die Frage ist nur, wie man das am besten hinbekommt. Hab bis jetzt noch keine Lösung gefunden.

Hier der verwendete Code:
Code:
for (int i = 0; i < int.Parse(tbAnswers.Text); i++)
     {
     tb = new TextBox();
     tb.ID = "tAnswer_" + i;
     platzhalter.Controls.Add(tb);
     platzhalter.Controls.Add(new LiteralControl("<br />\n"));
     }

Hat jemand eine Idee?

Vielen Dank im Voraus
 
Hm, ich kann zwar kein C#, würde das aber folgendermaßen machen:

a) Auf alle Elemente der Form zugreifen, dort alle Textboxen rausfiltern, dort alle Textboxen mit einer ID ^= 'tAnswer' auslesen.

- oder -

b) die erstellten Textboxen in der Klasse z.B. mittels eines Arrays sammeln und dann durch den Array gehen. Sinngemäß { tb = new TextBox(); ... alleTB[] = tb; ... }
 
Ist schon nen weilchen her das ich C# gemacht habe, aber vllt so (ca.):

foreach(Control currentControl in platzhalter.Controls)
{
if(currentControl.ID.contains("tAnswer_"))
{
TextBox t = (TextBox)currentControl;
//...mit der Textbox t etwas machen z.b t.Text benutzen um auf Inhlt zuzugreifen
}
}

Wie schon gesagt, kA ob das so geht...aber so würde ich es machen
 
zuerst... in C# für win form gibt es keine ID für Textboxen. Es gibt nur namen. Diese müssen nicht innerhalb deines parent formulars verschieden sein aber innerhalb eines container schon. Also wenn du groupbox benutzt und darin x Textboxen hast müssen sie alle verschiedene namen habe, sonst gibt es einen fehler (noch nicht ausprobiert aber der VS08 meckert wenn man die Textboxe Global im Design editor erstellen lässt)

Es gibt 2 vorgehensweise wie man die Controlelemente herausfinden kann. entweder mit

Code:
/*(parent) */Control[] c =MeinFormBla.Controls.Find(...);
if(c.Length>0){Textbox t = c[0]; t.Text ="";}

oder wenn du weisst dass dieser Textbox den parentcontrol element X hat kannst du so machen

Code:
GroupBox1.Controls["MeinTextBox"].Text = "";

Du sollst aber beide unter try catch abfragen...
 
Irgendwie funzt es einfach nicht. :(

Habe jetzt im übrigen herausgefunden, dass nach einem Page_Load alle zuvor erstellten dynamischen Controls fort sind. Somit hab ich auch keine Möglichkeit den Inhalt abzufragen, wenn ich das so wie bisher mache. Muss mir also was anderes überlegen.

Wie würdet ihr das lösen?

Edit: Hab hier eine Lösung gefunden, die genau mein Problem beschreibt. Allerdings werden da nur die Daten nach dem FinishButtonClick gespeichert. Ich häts ja noch gern vor diesem Schritt, also sozusagen beim NextButtonClick. Vielleicht fällt ja jemandem doch noch eine Lösung ein. Ich verwende erstmal vorläufig den Sample Code aus dem Link.

Edit 2: Kann mir jemand erklären, was dieser Ausdruck mit dem Fragezeichen zu bedeuten hat?
Code:
int? b = 2;
 
Zuletzt bearbeitet:
apolyton schrieb:
Habe jetzt im übrigen herausgefunden, dass nach einem Page_Load alle zuvor erstellten dynamischen Controls fort sind.
Laut dem Link von kelox musst du die dynamischen Controls im PreInit Event Handler erstellen.


Im übrigen würde ich es ungefähr so machen: (Hab aber keine Ahnung von ASP.NET)

Textboxen erstellen:
Code:
int m_numberOfTextBoxes = 5;
List<TextBox> m_textboxes = new List<TextBox>();

for(int i  = 0; i< m_numberOfTextBoxes; i++)
{
      TextBox tb = new TextBox();
      m_textboxes.Add(tb);
      platzhalter.Controls.Add(tb);
      platzhalter.Controls.Add(new LiteralControl("<br />\n"));
}

Textboxen auslesen:
Code:
foreach(TextBox tb in m_textboxes)
{
      //Inhalt abfragen
      string textBoxContent = tb.Text;      
}

apolyton schrieb:
Kann mir jemand erklären, was dieser Ausdruck mit dem Fragezeichen zu bedeuten hat?
Es bedeutet, dass die Variable 'null' werden darf.
Ein kurzes Beispiel:
Code:
//Hier würde der Compiler einen Fehler melden:
int a = null;

//Hier gibts keinen Fehler:
int? b = null;
 
Zurück
Oben