Entwickler-Ecke
C# - Die Sprache - Generierte Felder ansprechen
Romy - So 28.12.08 23:09
Titel: Generierte Felder ansprechen
Hallo,
ich habe folgendes rießiges Problem und hoff irgendjemand kann mir helfen!
Es geht um generierte Felder (Textfelder und Labelfelder) die zur Laufzeit erstellt werden.
Wie kann ich diese Felder ansprechen um zB zu überprüfen, ob sie ausgefüllt worden sind bzw. möchte ich die eingegebenen Werte in einem Excel-Sheet abspeichern.
Ich stell euch den Code für die generierten Felder mal rein, damit ihr besser versteht was ich meine:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| for (int i = 0; i < dgv.Columns.Count; i++) { label = new Label(); this.label.AutoSize = true; this.label.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label.Location = new System.Drawing.Point(10, 30 + i * 42); this.label.Name = "label" + i.ToString(); this.label.Size = new System.Drawing.Size(40, 18); this.label.TabIndex = 26; this.label.Text = dgv.Columns[i].HeaderText; this.groupBox2.Controls.Add(this.label);
textbox = new TextBox(); this.textbox.Location = new System.Drawing.Point(200, 30+i*42); this.textbox.Name = "txt" + i.ToString(); this.textbox.Size = new System.Drawing.Size(232, 24); this.textbox.TabIndex = 12; this.groupBox2.Controls.Add(this.textbox); } |
Ich hoffe, der Code sagt euch irgendetwas und ihr könnt mir helfen, herzlichen Dank schon mal im Voraus!
Lg Romy
Moderiert von
Kha: C#-Tags hinzugefügt
UGrohne - Mo 29.12.08 11:24
Entweder Du speicherst die Referenz irgendwo z.B. in einer
List<TextBox> oder Du verwendest einen EventHandler und weist diesen einer Methode zu oder Du gehst einfach Deine GroupBox durch. Da du dort aber auch Labels drin hast, tendiere ich für Dich mal zur ersten Variante:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| List<TextBox> textboxes = new List<TextBox>(); for (int i = 0; i < dgv.Columns.Count; i++) { label = new Label(); this.label.AutoSize = true; this.label.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label.Location = new System.Drawing.Point(10, 30 + i * 42); this.label.Name = "label" + i.ToString(); this.label.Size = new System.Drawing.Size(40, 18); this.label.TabIndex = 26; this.label.Text = dgv.Columns[i].HeaderText; this.groupBox2.Controls.Add(this.label);
textbox = new TextBox(); this.textbox.Location = new System.Drawing.Point(200, 30+i*42); this.textbox.Name = "txt" + i.ToString(); this.textbox.Size = new System.Drawing.Size(232, 24); this.textbox.TabIndex = 12; this.groupBox2.Controls.Add(this.textbox); labels.Add(textbox); } |
C#-Quelltext
1: 2: 3: 4:
| foreach (Label lbl in labels) { } |
JüTho - Mo 29.12.08 11:56
Hallo und :welcome:
Ich möchte Uwes Antwort noch etwas ergänzen.
Ich halte wenig davon, die Controls in einer eigenen Liste zu speichern: Das diente zwar (zurecht) einem speziellen Zweck, wäre aber eine doppelte Speicherung und ist eher unnötig, weil Du über groupbox2.Controls sowieso daran kommst.
Wenn es darum geht, den Wert einer bestimmten Textbox zu holen, kann das direkt erfolgen:
C#-Quelltext
1: 2: 3:
| TextBox box = groupBox2.Controls["txt7"] as TextBox; if (box != null) string content = box.Text; |
Wenn es darum geht, die eingetragenen Werte abzufragen, kannst Du (analog zu Uwes Vorschlag) so vorgehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| foreach(Control ctl in groupBox2.Controls) { TextBox box = ctl as TextBox; if (box != null) { string content = box.Text; string boxName = box.Name; } } |
Wenn es darum geht, Eingaben abzufragen, musst Du (wie Uwe erwähnte) EventHandler zuordnen. Wenn es immer um dieselbe Art von Eingabeprüfung handelt, kannst Du eine einheitliche Methode verwenden:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void BoxesValidating(object sender, CancelEventArgs e) { TextBox box = sender as TextBox; if (box != null) { if (String.IsNullOrEmpty(box.Text) e.Cancel = true; } }
textbox.TabIndex = 12; textbox.Validating += BoxesValidating; |
Dabei fällt mir noch ein Fehler auf (den ich als gravierend ansehe, es wundert mich, dass der Compiler das akzeptiert): label und textbox sind
lokale Variablen, die nur
innerhalb der for-Schleife gültig sind; sie sind keinesfalls Bestandteile der Klasse und dürften nicht mit this verbunden werden. (this kann sowieso fast immer weggelassen werden, auch wenn es so in der Designer.cs steht, die eigentlich als "Vorbild" verwendet werden kann.)
Ich hoffe, ich konnte ebenfalls helfen. Jürgen
Romy - Mo 29.12.08 12:58
Danke für eure schnellen Antworten!
Ihr habt mir sehr damit geholfen, wenn ich daran denke, wie lange ich mich schon mit dem Problem "herumspiele", ich war schon total verzweifelt, aber dank euch seh ich wieder Licht am Ende des Tunnels!
Herzlichen Dank,
lg Romy
Kha - Mo 29.12.08 19:06
JüTho hat folgendes geschrieben : |
Ich halte wenig davon, die Controls in einer eigenen Liste zu speichern: Das diente zwar (zurecht) einem speziellen Zweck, wäre aber eine doppelte Speicherung und ist eher unnötig, weil Du über groupbox2.Controls sowieso daran kommst. |
Wobei es ja nicht ausgeschlossen ist, dass die GroupBox noch andere Controls enthält. Und neben einer untypisierten Liste (die man so oder so braucht) noch eine typisierte zu haben, halte ich nicht für Redundanz.
JüTho hat folgendes geschrieben : |
Dabei fällt mir noch ein Fehler auf (den ich als gravierend ansehe, es wundert mich, dass der Compiler das akzeptiert): label und textbox sind lokale Variablen |
Nein, sind sie nicht. Wie du sagtest, können sie gar nicht sein ;) .
@Romy: Es macht sicher keinen Sinn, die beiden Variablen als Klassenfelder anzulegen, hier solltest du lokale Variablen benutzen. Wenn du allerdings Uwes Liste benutzt, muss die natürlich in einem Feld gespeichert werden, damit du sie in anderen Methoden benutzen kannst.
JüTho hat folgendes geschrieben : |
(this kann sowieso fast immer weggelassen werden, auch wenn es so in der Designer.cs steht, die eigentlich als "Vorbild" verwendet werden kann.) |
Als Syntax-Vorbild würde ich nun wirklich keinen autogenerierten CodeDOM-Code[meta]Nutzt der SWF-Designer überhaupt CodeDom?[/meta] hernehmen, der neigt immer zu Verbosity. Und Features exklusiv für Code-Behind wie
global:: oder partielle Klassen/Methoden haben in selbst geschriebenem Code überhaupt nichts zu suchen. Aber du hast natürlich Recht, dass sich dort schön erkennen lässt, wie die designte Form überhaupt zustande kommt.
JüTho - Mo 29.12.08 19:20
Kha hat folgendes geschrieben : |
Wobei es ja nicht ausgeschlossen ist, dass die GroupBox noch andere Controls enthält. Und neben einer untypisierten Liste (die man so oder so braucht) noch eine typisierte zu haben, halte ich nicht für Redundanz. |
OK, akzeptiert: Es kann sinnvolle Gründe geben.
Kha hat folgendes geschrieben : |
Nein, sind sie nicht. Wie du sagtest, können sie gar nicht sein ;) . |
Autsch, tatsächlich - ich habe nur den Konstruktor bemerkt. Deshalb möchte ich Kha zustimmen:
Kha hat folgendes geschrieben : |
@Romy: Es macht sicher keinen Sinn, die beiden Variablen als Klassenfelder anzulegen, hier solltest du lokale Variablen benutzen. |
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!