Entwickler-Ecke

WinForms - Controls zur Laufzeit erstellen und ansprechen


erfahrener Neuling - Fr 08.04.16 10:52
Titel: Controls zur Laufzeit erstellen und ansprechen
Hallo,

es wurde warscheinlich schon ziemlich oft gefragt, aber heute bin ich einfach zu verkatert, um die Sache selbst anzugehen. :eyes:

Könnte mir einer kurz und knapp erklären, wie ich ein Control (zB einen Button) so erstelle, dass ich ihn später mit nummeriertem Namen ansprechen kann (Controls.Button[i]...).

Das ganze soll 2 Programmen dienen:
1. dem Hauptprogramm, welches Control Daten aus einer Textdatei ließt und anhand dieser Daten zB Buttons anzeigt, anordnet und anklickbar macht.
2. einem Editor, mit dem man Felder individuell erstellen kann, anordnen usw und diese dann als Datenstruktur in besagte Textdatei schreibt

Also im Grunde geht es mir um die Erstellung und hinzufügen zu Controls und um die Abfrage zB in einem Click-Event.

Für Codebeispiele und Lösungs-/Denkansätze wäre ich sehr dankbar! Bitte nicht mit www.google.de o.Ä. antworten, dazu bin ich heute nicht fähig :nut:


Ralf Jansen - Fr 08.04.16 11:26

In seiner Frage ein 'ich bin heute zu faul macht das bitte für mich' unterzubringen ist für einen potentiellen Helfer extrem motivierend. Viel Glück beim lösen deines Problems.


Th69 - Fr 08.04.16 11:33

Tipp: Lass dir per Designer den entsprechenden Code erzeugen und kopiere ihn einfach aus der .designer.cs-Datei heraus.


erfahrener Neuling - Fr 08.04.16 11:57

@Th69
Zitat:
Tipp: Lass dir per Designer den entsprechenden Code erzeugen und kopiere ihn einfach aus der .designer.cs-Datei heraus.


Also wie der Code für das hinzuzufügende Control auszusehen hat, weiß ich schon (denke ich zumindest)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private void buttonCreateLabel_Click(object sender,EventArgs e)
{
  Label label = new Label();
  label.AutoSize = false;
  label.Size = new Size(140,40);
  label.BackColor = SystemColors.ActiveCaption;
  label.AutoEllipsis = true;
  label.Location = new Point(x,y);
  label.Name = "label" + amountOfLabels + 1;
  label.Click += new System.EventHandler(this.label_Click);
  this.Controls.Add(label);

  this.amountOfLabels++;
  this.x = this.x + 100;
}

private void label_Click(object sender, EventArgs e)
{
        //wie spreche ich zB label.Name = "label2" an?
}


Also das geht ja dann glaub ich mit Controls.??? oder geht das auch über sender?

@Ralf Jansen
Zitat:
In seiner Frage ein 'ich bin heute zu faul macht das bitte für mich' unterzubringen ist für einen potentiellen Helfer extrem motivierend. Viel Glück beim lösen deines Problems
Es ging mir ja nur darum, einen gewissen Ansatz zu finden (über google bin leider nicht fündig geworden). Ansonsten will ich's ja schon alleine Lösen und verstehen ;)

EDIT: in der Fragestellung habe ich zwar von Buttons gesprochen, aber eigentlich benutze ich labels, die als Button fungieren


Ralf Jansen - Fr 08.04.16 12:01

Wenn du bestimmte Controls auch noch direkt ansprechen willst packe sie nicht nur in die Controls Collection sondern zusätzlich in irgendeine Liste die du selbst verwaltest und damit besser unter Kontrolle hast.

Also wenn es z.B. nur um Labels geht dann zum Beispiel eine List<Label> oder wenn du die über Ihren Namen finden willst (denn du in auch Label.Name reinschreibst) kannst du ein Dictionary<string, Label> nehmen und als Key halt den Namen eintragen.


Edit: Oder wenn du die nur in Events brauchst

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void label_Click(object sender, EventArgs e)
{
   Label label = sender as Label;
   if (label != null)
   {
       // label.Name ....    
       // label.Text = ""; .... 
   }
}


erfahrener Neuling - Fr 08.04.16 12:12

Ja im Moment reicht das Event aus, genau das braucht ich :zustimm: