Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.12.2012, 19:21

C# Button in Variable speichern

Schönen Freitagabend miteinander!

ich würde gerne einen Button in einer Variable speichern. Dazu mal ein Beispiel:

C#-Quelltext

1
private void buttonClicked(object sender, MouseEventArgs e){Button btn = (Button)sender;btn.Text = "Guten Tag!";}



Jetzt habe ich das Problem, dass ich nicht "sender" habe sondern nur den Variablenname als String.
Wie kann ich jetzt den Button mit diesem Name in der Variable btn speichern?

Vielen dank und einen schönen Abend :)

PS: Zeilenumbrüche nimmt er im Quellcode nicht an :(

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

2

14.12.2012, 21:39

Ich weiß nicht genau, was du willst, aber

C#-Quelltext

1
Button btn = (Button)sender;

weist dir das Button-Objekt doch schon in die Variable btn zu? Damit kannst du doch an alle Eigenschaften von btn dran.

Wenn du nach Buttons/Controls nach Name suchen willst, bietet dir die Control Collection eine Find-Methode an. In etwa so:

C#-Quelltext

1
List<Controls> lst = this.Controls.Find("NameDesButtons",true).ToList();


Danach enthält lst alle Controls, die den Namen enthalten. Im besten Fall also nur eins, so kommst du mit lst[0] an deinen Button.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

14.12.2012, 23:51

ich möchte zu dem, was Linso geschrieben hat, hinzufügen, dass das nur funktioniert, wenn mit "Name der Variable" der Name des Buttons gemeint ist
wenn damit aber die Variable (Membervariable, lokale Variable, Parameter oder was auch immer) gemeint ist, dann wird es schon recht umständlich, sollte es überhaupt möglich sein
ich denke, Reflection ist an der Stelle evtl. ein geeignetes Stichwort

allerdings bezweifle ich, dass du das brauchst
in der Regel ist es gar nicht notwendig ein Steuerelement an einer weiteren Stelle zu speichern
(und selbst wenn es mal überlegenswert ist, den Button selbst zu speichern, dann hat man ihn selbst bereits)


aber schreibe doch bitte einfach mal, was du eigentlich vor hast
so ist das nur eine wilde Raterei...
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Yannic

unregistriert

4

15.12.2012, 09:45


(Link)

5

16.12.2012, 18:50

Hallo,
danke erstmal.

Es geht um ein Minesweeper. Der Spieler drückt auf einen Button im Spielfeld (Name das Buttons = Koordinaten => "x y" Bsp. "5 12"). Das "umdrehen" der Buttons hat mal ganz gut geklappt indem ich einfach den name des sender geholt habe. Jetzt möchte ich den Spaß aber etwas umstrukturieren, da ich diese "umdrehfunktion" auch anders aufrufen können muss. Daher möchte ich der Funktion gerne einfach die Koordinaten des Buttons geben, daraus den Name erstellen und dann einige Eigenschaften des Buttons ändern :)
Sry, dass ich erst so geizig mit Infos war :O ;)

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

6

16.12.2012, 19:54

Dazu vielleicht ein anderer Tipp: Mit Namen dieser Art zu arbeiten ist altmodisch und unpraktisch. Dafür gibt es auch Objektorientierte Ansätze.
Beispielsweise hat jeder Button eine .Tag Eigenschaft, der ein beliebiges Objekt zugewiesen werden kann. In deinem Fall würde sich da ja das Point() Objekt (System.Drawing Namespace) anbieten, das hat eine X- und eine Y-Koordinate. So kannst du ganz einfach beim Aufruf dann auf das Tag zugreifen.

C#-Quelltext

1
2
3
4
5
6
//Zuweisung:
btn.Tag = new Point(5,12);

//Aufruf:
int xKoordinate = ((Point)btn.Tag).X;
int yKoordinate = ((Point)btn.Tag).Y;


Und so kannst du auch umgekehrt ganz einfach nach dem entsprechenden Button suchen, mit ein bisschen LINQ:

C#-Quelltext

1
Button btn = (from elements in this.Controls where ((Point)elements.Tag).X == 5 && ((Point)elements.Tag).Y == 12).First();


Oder wenn du ganz sicher gehen willst, falls noch andere Controls auf dem Formular sind:

C#-Quelltext

1
Button btn = (from elements in this.Controls where elements.Tag != null && ((Point)elements.Tag).X == 5 && ((Point)elements.Tag).Y == 12).First();


Das ist viel sauberer, moderner und objektorientierter, als (in alter VB6-Manier) mit zusammengebastelten Strings zu arbeiten.

7

16.12.2012, 20:26

WOW! Vielen Dank!! Ich werd's direkt ausprobieren :)

8

16.12.2012, 21:50

Sorry. Ich bekomme es trotz Google nicht gebacken :/

Zitat

Auf einen Abfragetext muss eine Select-Klausel oder Group-Klausel folgen.

Gut. Da muss ich dann offenbar ein select ans Ende der Klammer setzen. Aber was will ich denn Auswählen? Ich bin planlos :wacko:

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

9

16.12.2012, 21:58

Ups sorry, manchmal schmeiß ich die Syntax der Sprachen durcheinander :D
Korrekt lautet es dann so:

C#-Quelltext

1
Button btn = (from elements in this.Controls where ((Point)elements.Tag).X == 5 && ((Point)elements.Tag).Y == 12 select elements).First();


Auswählen willst du ja den ganzen Button, also elements. Auf die Weise könnte man auch direkt Eigenschaften von den Elementen selektieren, ähnlich wie bei SQL.

10

16.12.2012, 22:10

ich verzeihe dir :P

aber klappen tut's immernoch nicht :'(

Zitat

Es konnte keine Implementierung des Abfragemusters für den Quelltyp "System.Windows.Forms.Control.ControlCollection" gefunden werden. "Where" wurde nicht gefunden. Geben Sie den Typ der Bereichsvariablen "elements" explizit an.

Werbeanzeige