C# Buttonname mit String

MickH74

Lieutenant
Registriert
Apr. 2009
Beiträge
591
Hallo liebes Forum,

arbeite an meinem ersten Programm in C# und habe folgendes Problem:

ich möchte mit einer Schleife durch eine Reihe von Buttons wechseln. Die Namen der Buttons sind SpielfeldButton1, SpielfeldButton2, SpielfeldButton3 usw.

Ich möchte also auf einen Button zugreifen, indem ich den Namen vorher aus "SpielfeldButton" + Zahl zusammensetze.

Im Netz habe ich eine Lösung gefunden, bei der das über this.Controls[NameAlsString] gehen soll.

Leider wird mir das Wort "Controls" rot unterstrichen, mit der Bemerkung, dass das Fenster "MainWindow" keine Definition für Controls enthält:

Screenshot 2021-04-18 163714.jpg


Was mache ich falsch?

Danke schon mal und viele Grüße aus Viersen,
Mick
 
Habe es groß und klein probiert. Macht aber keinen Unterschied.
 
Bei WPF hat MainWindow eine Property names Content in der wahrscheinlich ein Grid ist und da drin sind dann vielleicht deine Buttons. Das kommt darauf an wo du deine Buttons im Layout platziert hast. Mein Mein Tipp wäre es dem Container-Element in dem deine alle deine Buttons drin sind einen Namen zu geben und von dem aus auf diese zuzugreifen.

Das könnte so aussehen:
C#:
using System.Linq; // Für diese Lösung musst bei den Usings Linq einbinden.

// ....

container.Children.First(e => e.Name == buttonString).Content = "!";

Wobei das aus mehreren Gründen keine schöne Lösung ist. Für eine schönere Lösung würde ich einmal beim Programmstart alle Buttons in einem Array speichern. Damit ich dann im Programmverlauf per Index darauf zugreifen kann.

Edit:
C#:
Button[] buttons = container.Children.Where(b => b.Name.StartsWith("SpielfeldButton")).ToArray();
 
  • Gefällt mir
Reaktionen: Fombu und Hayda Ministral
Ja, die Button liegen in einem Grid. Habe beide Vorschläge ausprobiert. Beim ersten wird das Wort "First" als Fehler markiert und beim zweiten das "Where".
Der Fehler ist in beiden Fällen: UIElementCollection enthält keine Definition für...
 
Wie beim ersten Code-Beispiel geschrieben, du Linq einbinden. Also ganz oben bei den Usings folgendes hinzufügen:
C#:
using System.Linq;

Wenn du Visual Studio 2015 oder neuer verwendest kannst du auch einfach Alt + Enter und dann nochmal Enter drücken. Alt + Enter schlägt wie du den Fehler beheben kannst und mit Enter bestätigst du dann dass du dieses Using hinzufügen möchtest.
 
Using System.Linq; ist bei dem Projekt bereits von Beginn an aktiviert. Daran liegt es nicht.
 
Wäre ein Dictionary eigentlich nicht eleganter als ein Array? Wenn eh schon der Name bekannt ist?
 
Kommt darauf an wo der Name herkommt, ich gehe davon aus, dass der Plan des OPs war aus dem Index den Namen zu erstellen und den zur Suche des Buttons zu verwenden und in diesem Fall geht es über das Array einfacher. Sollte es anders sein, dann wäre ein Dictionary wahrscheinlich die elegantere Lösung.
 
Dadurch, dass es sich hier um eine sehr kuriose Fragestellung handelt, und es wie vom TE angemerkt sein erstes Programm in C# ist, sehe ich das hier eher als XY-Problem als eine konkrete Implementierungsfrage.
 
Ja, so ist es. Die Lernkurve ist steil. Auf myCsharp.de habe ich einen Guide gefunden, der gut erklärt, warum die Programmierung, so wie ich sie jetzt gemacht habe, nicht gut ist und wie es besser geht (nämlich mit einem Listen-Control).
 
  • Gefällt mir
Reaktionen: TriggerThumb87
Zurück
Oben