Code während der Laufzeit erstellen!


MichiStroi

Erfahrenes Mitglied
Hallo!

Ich möchte eine unzahl an Objekten während der Laufzeit erstellen.
Genauergesagt: Der Anwender gibt die Größe eines Spielfeldes ein. Anschließend soll mit einer For Schleife ein Spielfeld aus zB: 10 x 10 rechteckigen Buttons erstellt werden.
Jetzt hab ich allerding das Problem, dass ich den Buttons jedem einen eigenen Namen vergeben muss.
Kann ich in einer String Variable einen Code erstellen und dann ausführen lassen?
Gibts sonst noch irgendwelche Möglichkeiten?

Danke!

Grüße
Michi:rolleyes:
 

Alexander Schuc

crazy-weasel
Hi.

Warum? Du musst nicht jedem einen eigenen Namen geben. :)

Code:
int rows = 10;
int cols = 10;
Hashtable myButtons = new Hashtable();

for (int r = 0; r < rows; r++)
{
	for (int c = 0; c < cols; c++)
	{
		Button b = new Button();
		b.Size = new Size(20,20);
		b.Location = new Point(r * 20,r * c);
		b.Click += new EventHandler(this.ButtonClicked);
		myButtons.Add(new Point(r,c),b);
		this.Controls.Add(b);
	}
}

So erstellst du die benötigte Menge Buttons, weisst ihnen den rechten Platz zu, hast einen Click-Eventhandler und zusätzlich sind die Buttons in einem Hashtable gespeichert mit den Spielfeldkoordinaten als Punkt als Schlüssel des Hashtables.

MfG,
Alex
 

MichiStroi

Erfahrenes Mitglied
Hi Alex!

Cool!

Ein paar Fragen hät ich da aber noch...
Kann ich eigentlich dem Event Handler auch den Button mitgeben, den ich betätigt habe? Ich habs zwar geschafft den HashCode auszulesen aber könnt ich nicht auch gleich zwei Argumente mit Spalte , Zeile übergeben?

Oder, kann man in der Hash Tabelle feststellen welcher Button betätigt wurde?

Danke für deine Hilfe!

Michi
 

Alexander Schuc

crazy-weasel
Code:
Button b = new Button();
b.Size = new Size(20,20);
b.Location = new Point(r * 20,r * c);
b.Click += new EventHandler(this.ButtonClicked);

b.Tag = new Point(r,c);

myButtons.Add(new Point(r,c),b);
this.Controls.Add(b);

----

private void ButtonClicked(object sender, EventArgs ea)
{
    Button b = (Button) sender;
    Point p = (Point) b.Tag;
}

So könntest du u.a. den Punkt übergeben, sodass du ihn auch gleich im EventHandler hast.