Autor Beitrag
db1sla
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Sa 01.08.09 01:53 
Hallöchen,
ich komm hier irgendwie leider nicht mehr weiter. Mein Problem ist das folgende:
Ich habe auf einem Formular 20 Buttons (btnPlay1 ... btnPlay20). Jeder dieser Buttons macht das selbe, nämlich eine .wav-Datei abspielen. Die Pfade für die wav-Files dieser Buttons sind in einem anderen Formular konfigurierbar, ebenso der Text des Buttons und desses Farbe.
Jetzt möchte ich diese eingestellten Werte in einer Datei abspeichern, um sie beim nächsten Programmstart wieder zu laden und weiterzuverwenden. Dafür reicht mir eine einfache Text-Datei, die ich (bisher) mit StreamWriter erstelle.
Nun ist meine Frage: Kann ich irgendwie die Buttons in zB einer for-schleife duchnummerieren, wie zB ein Array auch durchnummerierbar ist, um nich jeden einzelnen Button einzeln abfragen zu müssen? Also irgendwas in der Art:

ausblenden C#-Quelltext
1:
2:
3:
4:
for (int z = 1; z == 20; z++)
{
   btnPlay[z].Text = "beispiel";
}


Ich hoffe, ihr versteht, was ich damit mein :-)
Kennt jemand dafür eine Lösung? Ich wär euch sehr dankbar!

Viele Grüße,
Stefan

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
PerryRhodan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 34


C# (VS 2005 + 2008), .NET 2.0 + 3.5 (inkl. WPF, WCF)
BeitragVerfasst: Sa 01.08.09 01:59 
Hallo,

guck Dir mal die Controls-Colletion einer Form an, also konkret zum Beispiel Controls["btnSonstwas"].

Natülich musst Du das Control noch entsprechend seines Typs casten.

ausblenden C#-Quelltext
1:
Button btnSonstwas = Controls["btnSonstwas"as Button;					


Grüße
PerryRhodan

_________________
C# im IRC: QuakeNet, Channel: #dotNet.de
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Sa 01.08.09 09:32 
Buttons haben die Eigenschaft Tag, die könntest du für sowas verwenden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (Button b in this.Controls)
{
    if (b.Tag.ToString () == "1")
        ..machWas
}


Tag ist ein Object Type, daher ist es eigentlich nicht so elegant ihr einen Text zuzuweisen (meine Meinung), aber es funktioniert. Über den Designer kann nur Text eingestellt werden, via Code kannst du der Eigenschaft Tag alles zuweisen was dir recht ist und bei bedarf zurück-casten.

_________________
Gruß
Christoph
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mo 03.08.09 08:17 
user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Buttons haben die Eigenschaft Tag, die könntest du für sowas verwenden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
foreach (Button b in this.Controls)
{
    if (b.Tag.ToString () == "1")
        ..machWas
}




Das wird dir so aber ne Exception werfen wenn du Controls hast die nicht vom Typ Button sind.
Foreach macht kann keine Typprüfung.


Also auf jeden kannst ja ne List<Button> anlegen und musst nicht die Controlsauflistung benutzen. Diese kannst du ja dann durchlaufen mit for, ....
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Mo 03.08.09 17:03 
Ok dann so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
foreach (Control c in this.Controls)
            {
                if (c is Button)                
                    if (c.Tag != null)                    
                        if (c.Tag.ToString() == "1")
                        {
                            Application.DoEvents();
                        }
            }



Warum eine neue Collection anlegen, wenn es schon eine gibt?

_________________
Gruß
Christoph
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Di 04.08.09 08:03 
user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:

Warum eine neue Collection anlegen, wenn es schon eine gibt?


Ist halt eine persönliche Einstellung - die Controlsauflistung zu benutzen scheint mir ein wenig von hinten durch die Brust ins Auge. Ich denke mal es macht den Code lesbarer wenn du die Controlsliste dafür nicht misbrauchst, sondern eine Liste anlegst die auch für diesen Zweck bestimmt ist.

Zumal du von einer List<Button> bzw. Button[] die du selbst befüllst ja weißt, dass es
- alles Buttons sind -> du sparst dir also die Konvertierung bzw Typprüfung
- alle Button in der Liste auch den Text zu setzen haben und musst nicht noch eine Abfrage auf den Tag machen, ob das nun ein Button ist bei dem ein Text zu setzen ist oder der Schließenbutton der Form

Natürlich ist deine Idee auch ne Lösung, ich würde halt eine extra Liste benutzen - ist ja wie immer in der Programmierung - es wird nie DIE Lösung geben.
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 11.08.09 19:22 
du könntest sowas in der art machen. die buttonzuweisungen (0-3) kannste ja einfach in eine schleife packen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
      Button[] btnArray = new Button[4];

      btnArray[0] = new Button();
      btnArray[0].Text = "Ich bin der 1. Button";
      btnArray[0].Location = new Point(1010);

      btnArray[1] = new Button();
      btnArray[1].Text = "Ich bin der 2. Button";
      btnArray[1].Location = new Point(1040);

      btnArray[2] = new Button();
      btnArray[2].Text = "Ich bin der 3. Button";
      btnArray[2].Location = new Point(1070);

      btnArray[3] = new Button();
      btnArray[3].Text = "Ich bin der 4. Button";
      btnArray[3].Location = new Point(10100);

      this.Controls.Add(btnArray[0]);
      this.Controls.Add(btnArray[1]);
      this.Controls.Add(btnArray[2]);
      this.Controls.Add(btnArray[3]);


ich hoffe das meintest du !? :/

EDIT:

also das wär der ansatz für das laden von buttons. genauso könntest du sie ja gleich erstellen. alternativ machst du dir ein struct oder eine klasse, in die du die daten speicherst... dann kannste beliebige daten speichern, ohne den button vollzumüllen.


Zuletzt bearbeitet von Äfan am Di 11.08.09 19:31, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 11.08.09 19:29 
Also wenn überhaupt, dann doch bitte nicht mit einem Array, sondern mit List<Button>. Bei einem Array bist du auf diese 4 Elemente festgelegt, eine List<T> kann beliebig erweitert werden.

Jürgen
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 11.08.09 19:33 
lol :D genau das selbe is mir grad auch eingefallen :D

oben stand was von 20 buttons... daher ein array. dynamisch ist natürlich eine List<Button> besser :)

@db1sla: also um es nochmal auszuführen:

mit einer List vom typ button, kannste mit der methode "Add" weitere buttons dynamisch hinzufügen... ohne dich vorher auf eine größe festlegen zu müssen ;)