none
Auf Buttons zugreifen RRS feed

  • Frage

  • Hi Programmierfreunde,

    Ich bin seit kurzem dabei ein Programm nach dem Prinzip von "Mensch Ärger Dich Nicht" zu schreiben. Für das gesamte Spielfeld benutze ich Buttons, die komplett durchnummiert(button1, button2, ...) sind und die sich je nach Spieler verfärben z.B. für Spieler1 rote Buttons und für Spieler2 blaue Buttons.

    Jetzt habe ich folgendes Problem:

    Gehen wir davon aus Spieler1 hat eine Spielfigur auf Button1 stehen, der Button ist somit Rot.
    Spieler1 würfelt eine 5.
    Wie ist es jetzt möglich auf Button6 zuzugreifen, dass ich diesen verfärben kann?
    Ist es vielleicht so in der Art machbar?

    int i = 5;
    Button[i].BackColor = System.Drawing.Color.Red;

    oder wie kann ich so auf Buttons zugreifen, sonst müsste ich ja für jede mögliche Zahl eine if schleife machen.

    Ich hoffe Ihr versteht mein Problem und könnt mir vielleicht ein wenig weiterhelfen, da ich nicht wirklich der beste Programmiercrack bin.

    Schönen Gruss.

    Freitag, 18. Mai 2012 16:05

Antworten

  • Hallo Kevin,

    Du kannst nicht mit button[zahl] auf den Button zugreifen. Dieser Code bedeutet nichts anderes, dass Du ein Array hast mit dem Namen button und dort das Element an der Stelle "zahl" abrufen willst. Dies hat nichts mit Deinem Problem zu tun.

    Da Deine Buttons alle auf einer Form sind, kannst Du die Controls-Auflistung der Form abarbeiten, bis Du den entsprechenden Button findest:

    string controlName = "button" + szahl;
    foreach(Control ctrl in theForm.Controls)
    {
       if(ctrl.Name == controlName)
       {
          // Button gefunden
          ctrl.BackColor = Color.Red
          break;
       }
    }

    Eine andere Variante wäre, in der Form eine HashTable zu hinterlegen, die alle Deine Buttons beinhaltet:

    private HashTable _Buttons;
    public HashTable Buttons
    {
       get
       {
          if(_Buttons == null)
          {
             _Buttons = new HashTable();
          }
          return _Buttons;
       }
    }

    Im Konstruktor würde ich die HashTbale dann füllen:

    public theForm
    {
       this.Buttons.Add(1, button1);
       this.Buttons.Add(2, button2);
       this.Buttons.Add(3, button3);
       ...
    }

    Du kannst dann im Code auf die HashTable zugreifen mit dem "Key" (sprich der Zahl) des Buttons:

    ...
    int ergebnis = buttonnr + wuerfel;
    Button btn = this.Buttons[ergebnis];
    btn.BackCOlor = Color.Red

    Freitag, 18. Mai 2012 18:13
  • Hallo Kevin,

    da hast Recht, anstatt Form1.Controls muss es natürlich this.Controls lauten.

    Gruß

    Christian

    P.S.: Wenn Dich Antwort Dein Problem gelöst hat, bitte als Antwort markieren bzw. die entsprechenden Posts als hilfreich bewerten. Dadurch finden andere User, die das gleiche oder ein ähnliches Problem haben, schneller Lösungen...

    Freitag, 18. Mai 2012 20:11

Alle Antworten

  • Hallo Kevin,

    da würde die <ControlCollection>.Find( ... ) Methode helfen. Siehe:

      http://msdn.microsoft.com/de-de/library/system.windows.forms.control.controlcollection.find.aspx

    In deinem Fall also bspw.:

    Private Sub ColorizeButton( ByVal ButtonId As Int64, ByVal Color As ... )
    
    Dim Button As Button
        Button = CType( Me.Controls.Find( String.Format( "Button{0}", ButtonId.ToString() ), True ), Button )
        Button.BackColor = Color
    
    End Sub
    

    Du musst natürlich noch eine Fehlerprüfung einbauen, den Weg sollte das aber zeigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 18. Mai 2012 16:33
    Moderator
  • Also das ist ja schon fast ein wenig zu kompliziert für mich :)

    Ich schreibe hier nochmal einen Quellcode rein, den ich eben zum verdeutlichen geschrieben habe:

    private void button1_Click(object sender, EventArgs e)
            {
                if (button1.BackColor == Color.Red)
                {
                    int buttonnr = 1; // Weil es der 1. Button ist
                    int würfel = 2;  // gehen wir davon aus es wird eine 2 gewürfelt
                    int ergebnis = buttonnr + würfel; // ermittelt den button der gefärbt werden muss; hier button3
                    string szahl = ergebnis.ToString();
    
                    button[szahl].BackColor = System.Drawing.Color.Red; // Hier ist der Fehler, keine Ahnung wie ich auf button 3 so zugreifen kann
                }
            }

    Freitag, 18. Mai 2012 17:08
  • Hallo Kevin,

    Du kannst nicht mit button[zahl] auf den Button zugreifen. Dieser Code bedeutet nichts anderes, dass Du ein Array hast mit dem Namen button und dort das Element an der Stelle "zahl" abrufen willst. Dies hat nichts mit Deinem Problem zu tun.

    Da Deine Buttons alle auf einer Form sind, kannst Du die Controls-Auflistung der Form abarbeiten, bis Du den entsprechenden Button findest:

    string controlName = "button" + szahl;
    foreach(Control ctrl in theForm.Controls)
    {
       if(ctrl.Name == controlName)
       {
          // Button gefunden
          ctrl.BackColor = Color.Red
          break;
       }
    }

    Eine andere Variante wäre, in der Form eine HashTable zu hinterlegen, die alle Deine Buttons beinhaltet:

    private HashTable _Buttons;
    public HashTable Buttons
    {
       get
       {
          if(_Buttons == null)
          {
             _Buttons = new HashTable();
          }
          return _Buttons;
       }
    }

    Im Konstruktor würde ich die HashTbale dann füllen:

    public theForm
    {
       this.Buttons.Add(1, button1);
       this.Buttons.Add(2, button2);
       this.Buttons.Add(3, button3);
       ...
    }

    Du kannst dann im Code auf die HashTable zugreifen mit dem "Key" (sprich der Zahl) des Buttons:

    ...
    int ergebnis = buttonnr + wuerfel;
    Button btn = this.Buttons[ergebnis];
    btn.BackCOlor = Color.Red

    Freitag, 18. Mai 2012 18:13
  • string controlName = "button" + szahl;
    foreach(Control ctrl in theForm.Controls)
    {
       if(ctrl.Name == controlName)
       {
          // Button gefunden
          ctrl.BackColor = Color.Red
          break;
       }
    }

    Vielen Dank schonmal für die Bemühungen.
    Das klingt ja schonmal sehr plausibel und gut, jedoch bekomme ich dort einen Fehler.

    Bei foreach(Control ctrl in Form1.Controls) kommt folgender Fehler:    Für das nicht statische Feld, die Methode oder die Eigenschaft "System.Windows.Forms.Control.Controls.get" ist ein Objektverweis erforderlich.  


    Freitag, 18. Mai 2012 18:44
  • Hallo Kevin,

    da hast Recht, anstatt Form1.Controls muss es natürlich this.Controls lauten.

    Gruß

    Christian

    P.S.: Wenn Dich Antwort Dein Problem gelöst hat, bitte als Antwort markieren bzw. die entsprechenden Posts als hilfreich bewerten. Dadurch finden andere User, die das gleiche oder ein ähnliches Problem haben, schneller Lösungen...

    Freitag, 18. Mai 2012 20:11
  • Hey, super vielen Dank für Eure Hilfe.

    Es hat wirklich funktioniert.

    Freitag, 18. Mai 2012 20:49
  • da hast Recht, anstatt Form1.Controls muss es natürlich this.Controls lauten.

    this.Controls ist redundant. Lieber gleich nur Controls nutzen!

    MfG, A. Long

    Samstag, 19. Mai 2012 09:39