Entwickler-Ecke
WinForms - Buttonname auslesen um Buttongrafik zu ändern
chip777 - Mi 22.09.10 21:15
Titel: Buttonname auslesen um Buttongrafik zu ändern
Hallo,
ich hab vor ein Spiel zu programmieren, dort gibt es 64 Buttons, ich will folgendes realisieren:
Jeweils ein Button soll mit einem Bild belegt sein(7 verschiedene Bilder), wenn der Button geklickt wird soll ein anderen Button mit einem Bild belegt werden und der alte soll wieder rückgesetzt werden.
Hier ein bisschen Code dazu:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| private void Colorswitch(int arraycolor) { if (arraycolor == 1) button1.Image = WindowsFormsApplication1.Properties.Resources.grün; if (arraycolor == 2) button1.Image = WindowsFormsApplication1.Properties.Resources.dunkelblau; if (arraycolor == 3) button1.Image = WindowsFormsApplication1.Properties.Resources.hellblau; if (arraycolor == 4) button1.Image = WindowsFormsApplication1.Properties.Resources.lila; if (arraycolor == 5) button1.Image = WindowsFormsApplication1.Properties.Resources.orange; if (arraycolor == 6) button1.Image = WindowsFormsApplication1.Properties.Resources.rosa; if (arraycolor == 7) button1.Image = WindowsFormsApplication1.Properties.Resources.rot; } Random number = new Random(); int randomnumber = number.Next(0, 64) + 1; Random color = new Random(); int arraycolor = color.Next(0, 7) + 1; label3.Text = randomnumber.ToString(); if (randomnumber == 1) { Colorswitch(arraycolor); } |
Nun zu meinem Problem, ich würde gerne in der Methode Colorswitch das button1 ersetzen, und zwar so das der button der per Zufallszahl gewählt wurde die neue Farbe bekommt, allerdings weiß ich nicht wie ich aus einer Zufallszahl(1-64) einen button(auch 1-64) mache.
Hoffe ich konnte mich verständlich genug ausdrücken.
Gruß Martin
Trashkid2000 - Mi 22.09.10 22:39
Hi,
also. das Ganze wäre ja eigentlich einfach zu lösen. Wenn denn die Buttons in einer Collection wären, wie z.B. einem Arry oder einer List. Dann könntest Du einfach den Index in dieser Collection anhand der Zufallszahl wählen, und das Objekt dementsprechend ändern.
Wenn sich allerdings die Buttons nicht in einer Collection befinden (also durch den Designer einfach nur auf die Form platziert sind) [ja, ich weiß, eine ControlCollection ist auch eine Collection] wird es schon schwieriger. Denn in this.Controls sind halt alle Controls enthalten, bis zur 1. Stufe. Soll heißen, wenn sich z.B. weitere Controls auf einem Panel der Form befinden, so ist in der Collection zwar das Panel, aber nicht die Controls auf diesem Panel.
Wenn sich die Buttons auf der Form befinden, so könntest Du die Controls, die vom Typ Button sind und einen Namen besitzen, der identifiziert, das es halt solche Buttons sind, die die Farbe bekommen sollen, per LinQ abfragen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var buttonControls = from control in this.Controls.Cast<Control>() .Where(control => control.Name.ToLower().Contains("yourIdentifier") && control.GetType().Equals(typeof(Button))) select control;
if (buttonControls != null) { buttonControls.ElementAt(GenerierteZahl).BackColor = Color.AliceBlue; } |
Und dann kannst Du den Button auf die neue Farbe setzen. Aber besser wäre es wirklich, die Buttons, die farblich geändert werden sollen (bzw. können) in einer Collection zu halten (bei der Anzahl von 64 empfiehlt es sich eh, die Buttons dynamisch zu generiern, denke ich mal).
Hoffe, ich konnte Dir helfen.
LG, Marko
danielf - Do 23.09.10 08:40
Hallo,
also das halte ich schon für gemurkse mit dem Identifikator. Auch die Buttons per Designer zu definieren halte ich für Unsinnig, weil der Code dann viel zu statisch ist.
Ich würde die Anzahl an Buttons dynamisch erzeugen. Dann ist es auch keinen Aufwand sie (wie Trashkid) schon angesprochen hat sie in eine Liste zu packen. Wenn du diese Konstellation hast, benötigst du nur die Zufallszahl einen Mapper von Zufallszahl auf Image und eine Methode die dies deinem Button zuweißt.
Könnte dann so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| List<Button> buttons = new List<Button>(); for (int x = 0; x < rows; x++) { for (int y = 0; y < columns; y++) { Button newButton = new Button(); newButton.Click ... buttons.Add(newButton); } } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Image randomImage = ImagePool[random.Next(0,ImagePool.Count)];
buttons[3].Image = randomImage;
buttons[random.Next(0,buttons.Count)].Image = randomImage; |
Keep it simple.
Gruß
chip777 - Mi 06.10.10 11:05
Hi,
sorry erstmal das ich mich solange nicht gemeldet habe, hatte noch einige andere Dinge zu tun. Jetzt drängt dieses Projekt allerdings^^
Ich werd es mit Daniels Idee versuchen und die Buttons dynamisch erzeugen, da ich sowas noch nicht gemacht habe, werden da wohl Schwierigkeiten auftreten, falls dem so sein sollte werd ich mich wieder melden.
Erstmal danke für die ausführlichen Antworten.
Gleich mal noch ne Frage: Kann ich den Klick Event für alle Buttons gleich machen? Also alle auf einen Event registrieren? Und wenn ja, bekomme ich immer noch raus welcher Button den Event ausgelöst hat?
Gruß Martin
Necaremus - Mi 06.10.10 11:16
| Zitat: |
| Kann ich den Klick Event für alle Buttons gleich machen? Also alle auf einen Event registrieren? |
Ja, du kannst in der for schleife von danielf den buttons einfach ein event zu weisen, wie danielf in seinem code beispiel schon andeutet.
| Zitat: |
| Und wenn ja, bekomme ich immer noch raus welcher Button den Event ausgelöst hat? |
Ja.
Stichwort "sender":
MyClickEvent(object sender, EventArgs e)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!