Autor Beitrag
Holger_S
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 16.09.12 22:27 
Hallo liebe Community,

ich bin leider kein Experte aber ich versuch mich ein wenig zu verbessern.

Leider stecke ich grade fest und suche Hilfe.

Folgendes Problem:

Ich möchte Buttons und Textfelder mit hilfe von Variablen ansprechen in einer Methode.
Das soll wiefolg aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public void methode ( int a , int b ) {

button[a].enabled = false;
textBox[b].Text = "Test";

}


Kurze Anmerkung !
Die Buttons sind via WinForm gesetzt und in recht großer Anzahl vertreten dort.
D.h. ich kann es meines Wissens nach nicht mit einem Feld von Buttons lösen.


Das ist jetzt nur ein Beispiel und sehr vereinfacht, mit geht es in erster Linie um dieses Problem.
Ich hoffe jemand kann mit helfen oder einen Tip geben :)

Vielen Dank !


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 17.09.2012 um 07:45
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 17.09.12 08:59 
Hallo!

Zwei Möglichkeiten hast Du:

Entweder Du erstellst die Komponenten nicht mit dem Designer, sondern im Quelltext:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Button[] buttons = new Button[10]; //als Feld deklarieren!

/* ... */

for(int i = 0; i < buttons.Length; i++) //im Konstruktor der Form nach InitializeComponent() aufrufen
{
  buttons[i] = new Button();
  buttons[i].Left = 42;
  buttons[i].Top = 45;
  buttons[i].Text = "Foo";
  buttons[i].Parent = this;
}

Dann kannst Du einfach per Index drauf zugreifen.

Oder Du suchst die Komponenten anhand ihres Namens:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public void methode ( int a , int b ) {
  var aButton = (Button) this.Controls.Find("button"+a.ToString(), true);
  var bTextBox = (TextBox) this.Controls.Find("textBox"+b.ToString(), true);

  aButton.enabled = false;
  bTextBox.Text = "Test";
}

Da solltest Du dann aber noch ein paar Prüfungen einbauen, ob die Komponenten auch wirklich gefunden wurden.

Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Holger_S Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 17.09.12 09:52 
Ja, das hilft mir weiter.
Die erste Variante kommt leider nicht in Frage aber ich versuch mich an der Zweiten :)

Vielen Dank !
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.09.12 10:36 
Hallo Holger_S,

es ist trotzdem ein sehr schlechtes Design, wenn die Controls alle direkt per Designer gesetzt sind und nur die fortlaufenden Namen wie "buttonX" oder "labelY" tragen.
Entweder man benennt die Controls vernünftig und spricht sie dann einzeln an, oder aber man verwendet ein passendes Containercontrol (z.B. DataGridView, TableLayoutPanel). Ein weiterer Ansatz ist die Verwendung von UserControls und dynamischer Erstellung (so wie Christian schon geschrieben hat - wobei m.E. im allgemeinen eine List<T> besser wäre).
Könntest du evtl. einen Screenshot von deiner Form posten (bzw. als Dummy)? Dann kann ich dir einen konkreteren Tipp geben.
Holger_S Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 19.09.12 21:21 
Hallo und vielen Dank für die freundliche Hilfe.

Mittlerweile habe ich das eingesehen und nochmal von Vorne gestartet.
Es ist völlig richtig das ein UserControl hier angebrachter ist als das was ich vor hatte.
Natürlich sind mir da "programmiertechnisch" meine mangelnden Fertigkeiten im Weg.

:(

Aber Danke für das freundliche Angebot!