Benutzer mit den meisten Antworten
Auf Buttons zugreifen

Frage
-
Hi Programmierfreunde,
Ich bin seit kurzem dabei ein Programm nach dem Prinzip von "Mensch Ärger Dich Nicht" zu schreiben. Für das gesamte Spielfeld benutze ich Buttons, die komplett durchnummiert(button1, button2, ...) sind und die sich je nach Spieler verfärben z.B. für Spieler1 rote Buttons und für Spieler2 blaue Buttons.
Jetzt habe ich folgendes Problem:
Gehen wir davon aus Spieler1 hat eine Spielfigur auf Button1 stehen, der Button ist somit Rot.
Spieler1 würfelt eine 5.
Wie ist es jetzt möglich auf Button6 zuzugreifen, dass ich diesen verfärben kann?
Ist es vielleicht so in der Art machbar?int i = 5;
Button[i].BackColor = System.Drawing.Color.Red;oder wie kann ich so auf Buttons zugreifen, sonst müsste ich ja für jede mögliche Zahl eine if schleife machen.
Ich hoffe Ihr versteht mein Problem und könnt mir vielleicht ein wenig weiterhelfen, da ich nicht wirklich der beste Programmiercrack bin.
Schönen Gruss.
Antworten
-
Hallo Kevin,
Du kannst nicht mit button[zahl] auf den Button zugreifen. Dieser Code bedeutet nichts anderes, dass Du ein Array hast mit dem Namen button und dort das Element an der Stelle "zahl" abrufen willst. Dies hat nichts mit Deinem Problem zu tun.
Da Deine Buttons alle auf einer Form sind, kannst Du die Controls-Auflistung der Form abarbeiten, bis Du den entsprechenden Button findest:
string controlName = "button" + szahl; foreach(Control ctrl in theForm.Controls) { if(ctrl.Name == controlName) { // Button gefunden ctrl.BackColor = Color.Red break; } }
Eine andere Variante wäre, in der Form eine HashTable zu hinterlegen, die alle Deine Buttons beinhaltet:
private HashTable _Buttons; public HashTable Buttons { get { if(_Buttons == null) { _Buttons = new HashTable(); } return _Buttons; } }
Im Konstruktor würde ich die HashTbale dann füllen:
public theForm { this.Buttons.Add(1, button1); this.Buttons.Add(2, button2); this.Buttons.Add(3, button3); ... }
Du kannst dann im Code auf die HashTable zugreifen mit dem "Key" (sprich der Zahl) des Buttons:
... int ergebnis = buttonnr + wuerfel; Button btn = this.Buttons[ergebnis]; btn.BackCOlor = Color.Red
- Als Antwort markiert Kevin Niemeier Freitag, 18. Mai 2012 20:50
-
Hallo Kevin,
da hast Recht, anstatt Form1.Controls muss es natürlich this.Controls lauten.
Gruß
Christian
P.S.: Wenn Dich Antwort Dein Problem gelöst hat, bitte als Antwort markieren bzw. die entsprechenden Posts als hilfreich bewerten. Dadurch finden andere User, die das gleiche oder ein ähnliches Problem haben, schneller Lösungen...
- Als Antwort markiert Kevin Niemeier Freitag, 18. Mai 2012 20:50
Alle Antworten
-
Hallo Kevin,
da würde die <ControlCollection>.Find( ... ) Methode helfen. Siehe:
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.controlcollection.find.aspx
In deinem Fall also bspw.:
Private Sub ColorizeButton( ByVal ButtonId As Int64, ByVal Color As ... ) Dim Button As Button Button = CType( Me.Controls.Find( String.Format( "Button{0}", ButtonId.ToString() ), True ), Button ) Button.BackColor = Color End Sub
Du musst natürlich noch eine Fehlerprüfung einbauen, den Weg sollte das aber zeigen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Also das ist ja schon fast ein wenig zu kompliziert für mich :)
Ich schreibe hier nochmal einen Quellcode rein, den ich eben zum verdeutlichen geschrieben habe:private void button1_Click(object sender, EventArgs e) { if (button1.BackColor == Color.Red) { int buttonnr = 1; // Weil es der 1. Button ist int würfel = 2; // gehen wir davon aus es wird eine 2 gewürfelt int ergebnis = buttonnr + würfel; // ermittelt den button der gefärbt werden muss; hier button3 string szahl = ergebnis.ToString(); button[szahl].BackColor = System.Drawing.Color.Red; // Hier ist der Fehler, keine Ahnung wie ich auf button 3 so zugreifen kann } }
-
Hallo Kevin,
Du kannst nicht mit button[zahl] auf den Button zugreifen. Dieser Code bedeutet nichts anderes, dass Du ein Array hast mit dem Namen button und dort das Element an der Stelle "zahl" abrufen willst. Dies hat nichts mit Deinem Problem zu tun.
Da Deine Buttons alle auf einer Form sind, kannst Du die Controls-Auflistung der Form abarbeiten, bis Du den entsprechenden Button findest:
string controlName = "button" + szahl; foreach(Control ctrl in theForm.Controls) { if(ctrl.Name == controlName) { // Button gefunden ctrl.BackColor = Color.Red break; } }
Eine andere Variante wäre, in der Form eine HashTable zu hinterlegen, die alle Deine Buttons beinhaltet:
private HashTable _Buttons; public HashTable Buttons { get { if(_Buttons == null) { _Buttons = new HashTable(); } return _Buttons; } }
Im Konstruktor würde ich die HashTbale dann füllen:
public theForm { this.Buttons.Add(1, button1); this.Buttons.Add(2, button2); this.Buttons.Add(3, button3); ... }
Du kannst dann im Code auf die HashTable zugreifen mit dem "Key" (sprich der Zahl) des Buttons:
... int ergebnis = buttonnr + wuerfel; Button btn = this.Buttons[ergebnis]; btn.BackCOlor = Color.Red
- Als Antwort markiert Kevin Niemeier Freitag, 18. Mai 2012 20:50
-
string controlName = "button" + szahl; foreach(Control ctrl in theForm.Controls) { if(ctrl.Name == controlName) { // Button gefunden ctrl.BackColor = Color.Red break; } }
Vielen Dank schonmal für die Bemühungen.
Das klingt ja schonmal sehr plausibel und gut, jedoch bekomme ich dort einen Fehler.Bei foreach(Control ctrl in Form1.Controls) kommt folgender Fehler: Für das nicht statische Feld, die Methode oder die Eigenschaft "System.Windows.Forms.Control.Controls.get" ist ein Objektverweis erforderlich.
-
Hallo Kevin,
da hast Recht, anstatt Form1.Controls muss es natürlich this.Controls lauten.
Gruß
Christian
P.S.: Wenn Dich Antwort Dein Problem gelöst hat, bitte als Antwort markieren bzw. die entsprechenden Posts als hilfreich bewerten. Dadurch finden andere User, die das gleiche oder ein ähnliches Problem haben, schneller Lösungen...
- Als Antwort markiert Kevin Niemeier Freitag, 18. Mai 2012 20:50