Autor |
Beitrag |
Romy
Hält's aus hier
Beiträge: 8
Win XP
VB, Java, C#
|
Verfasst: So 28.12.08 23:09
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
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 29.12.08 11:24
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 29.12.08 11:56
Hallo und
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 
Hält's aus hier
Beiträge: 8
Win XP
VB, Java, C#
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 29.12.08 19:20
|
|
|