Autor Beitrag
Romy
Hält's aus hier
Beiträge: 8

Win XP
VB, Java, C#
BeitragVerfasst: 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:

ausblenden 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(1030 + i * 42);
                this.label.Name = "label" + i.ToString();
                this.label.Size = new System.Drawing.Size(4018);
                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(20030+i*42);
                this.textbox.Name = "txt" + i.ToString();
                this.textbox.Size = new System.Drawing.Size(23224);
                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 user profile iconKha: C#-Tags hinzugefügt
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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:
ausblenden 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(1030 + i * 42);
                this.label.Name = "label" + i.ToString();
                this.label.Size = new System.Drawing.Size(4018);
                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(20030+i*42);
                this.textbox.Name = "txt" + i.ToString();
                this.textbox.Size = new System.Drawing.Size(23224);
                this.textbox.TabIndex = 12;
                this.groupBox2.Controls.Add(this.textbox);
                labels.Add(textbox);
            }

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (Label lbl in labels)
{
  //Dein test mit lbl
}
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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) {
      //  mach was damit, z.B.
      string content = box.Text;
      //  Du kannst auch den Namen abfragen:
      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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//  so werden alle diese TextBoxen überprüft:
private void BoxesValidating(object sender, CancelEventArgs e) 
{
   TextBox box = sender as TextBox;
   if (box != null)    //  Sicherheitsprüfung
   {
      if (String.IsNullOrEmpty(box.Text)
         e.Cancel = true;
   }
}

//  so wird dieser EventHandler zugeordnet - einheitlich für alle diese Textboxen:
   //  nach dieser Anweisung
   textbox.TabIndex = 12
   //  kommt noch diese:
   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 Threadstarter
Hält's aus hier
Beiträge: 8

Win XP
VB, Java, C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 29.12.08 19:06 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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.
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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.
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
(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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mo 29.12.08 19:20 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
@Romy: Es macht sicher keinen Sinn, die beiden Variablen als Klassenfelder anzulegen, hier solltest du lokale Variablen benutzen.


Gruß Jürgen