Announcement

Collapse
No announcement yet.

Automatisch Buttons erstellen anhand vordefinierter Anzahl

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Automatisch Buttons erstellen anhand vordefinierter Anzahl

    Hallo Ihr,

    ich möchte ein flowlayoutpanel mit einer bestimmten Anzahl an Buttons füllen. Die Buttons sollen sich an die Größe des Pannels anpassen, was auch kein Problem macht. Mein Problem ist, wie bekomme ich die Anzahl die ich will automatisch da hin? Ich habe also zum Beispiel als Vorgabe 6 Buttons die ich erstellen will. Somit habe ich als int nur die Zahl 6. Mit einer foreach anweisung komme ich da nicht weit. Wie schaffe ich es also ein das Panel zu füllen?

    Danke schon mal für die Hilfe...!

    Ciao Chris!

  • #2
    Originally posted by Hurtz2k View Post
    Hallo Ihr,

    ich möchte ein flowlayoutpanel mit einer bestimmten Anzahl an Buttons füllen.
    Auf die Schnelle:

    Code:
    for (int i =0; i < 6; i++)
    {
      Button b = new Button();
      b.Name = "b" + i.ToString();
      b.Parent = flowLayoutPanel1;
      b.Text="Button"+i.ToString();
    }
    Gruß
    Peter

    Comment


    • #3
      Hi Peter,

      danke für die schnelle Antwort. Ich muss ja zugeben, dass ich gerade als ich die Mail bekommen habe, dass jemand geantwortet hat eine Lösung gefunden habe. Habe ein int mit dem Wert 0 erstellt und dann eine while schleife genutzt, aber das is ja ziemlich ähnlich...!

      Aber mal ne andere Frage zum fast gleichen Thema. Die Buttons sollen ja auch was ausführen. Ich kann jetzt natürlich jedem Button das gleiche SystemEvent zuordnen und per Switch-Case anweisung dann was unterschiedliches ausführen lassen, aber das würde ja erfordern, dass ich sämtliche Case-Anweisungen vorher erstellen muss, was ja nicht im Sinne des erfinders wäre. Meine Versuche, eine while oder foreach-Schleife für die Case-Anweisungen zu erstellen geht nicht. Ich muss mit dem Button ein Fenster öffnen und dabei den Namen des Buttons (also die Nummer) und eine Variable aus der Datenbank übergeben. Die Buttons müssen aber auch (wenn ein bool-Wert auf True steht) etwas anderes ausführen (Text anzeigen, Ton wiedergeben oder Bild anzeigen). Wie kann ich jedem Button nun eine Anweisung geben?

      Danke schonmal...

      Ciao Chris

      Comment


      • #4
        Chris,

        bin schon auf dem Weg ins Bett, deshalb nur auf die Schnelle:

        Ich kann jetzt natürlich jedem Button das gleiche SystemEvent zuordnen
        Ja das ist schon OK. Aber keine switch Anweisung. Sondern gib jedem Button die Informationen mit, die er benötigt. Dazu erstellst Du eine Klasse, die diese Information speichert. Jedes Control also auch der Button hat das Property Tag, dem weist Du eine Instanz dieser Klasse zu. Im Click Event holst Du Dir das dem Tag-Property zugewiesene Objekt. Hier könntest Du zum Beispiel auch einen Delegate mitgeben, den Du dann direkt aufrufen könntest....

        Guts Nächtle
        Peter

        Comment


        • #5
          Hallo Chris,

          Du kannst aber auch gleich zum Zeitpunkt des Button-Erstellens ein Click-Ereignis hinzufuegen. Bin mir nicht sicher, ob das hier anwendbar ist, aber gehen wuerd es zB so:

          Code:
          Button btn = new Button();
          btn.Click += delegate { MessageBox.Show("Test: Hallo"); };
          ...
          *-- robert.oh. --*

          Comment


          • #6
            Danke schon mal für die Antwort! Ich steh da aber noch ein wenig auf dem Schlauch...!

            Ich gebe dem neuen Button den Click-Befehl:
            Code:
             neu.Click += new System.EventHandler(button_Click);
            und gebe ihm den Tag:
            Code:
             neu.Tag = erstellt.ToString();
            Gesamter Code der Schleife:
            Code:
            int rows = 5;
                        int buttons = 25/ rows;
                        int erstellt = 0;
            
                        while (erstellt < buttons * rows)
                        {
                            
                            Button neu = new Button();
                            neu.Click += new System.EventHandler(button_Click);
                            neu.Visible = true;
                            neu.Parent = flowLayoutPanel1;
                            neu.Width = flowLayoutPanel1.Width / buttons - 6;
                            neu.Height = flowLayoutPanel1.Height / rows - 6;
                            erstellt++;
                            neu.Tag = erstellt.ToString();
                            neu.Text = erstellt.ToString();
                            
                            
            
                        }
            Dann schreib ich den EventHandler button_Click:
            Code:
             private void button_Click(object sender, EventArgs e)
            So, wie bekomm ich jetzt die Tag-Eigenschaft wieder zurück???

            Was die delegate Methode angeht, haben scheinbar die Buttons alle den gleichen wert. Habe zum Test einfach nur die Zahl "erstellt" (welche zählt, wieviele Buttons schon erstellt wurden) in einer MessageBox anzeigen lassen wollen, mir wird aber dann bei jedem Button "25" angezeigt...!? Wie das?

            Code:
            neu.Click += delegate { MessageBox.Show(erstellt.toString()); };

            Comment


            • #7
              Hallo,

              Was das 'Wie bekomme ich den Wert vom Tag zurueck' angeht, kannst du zB so drauf zugreifen.

              Code:
              private void button_Click(object sender, EventArgs e)
              {
                  Button btnClicked = (Button)sender; // den Aufrufer von object in den konkreten Typ Button umwandeln
                  // Sicherheitsabfrage, ob es wirklich ein Button ist
               
               
              }
              *-- robert.oh. --*

              Comment


              • #8
                Hallo,

                Auf den Tag kannst du zB so zugreifen:

                Code:
                private void button_Click(object sender, EventArgs e)
                {
                  // Aufrufer in den konkreten Typ Button umwandeln
                  Button btnClicked = (Button)sender;
                  // Pruefen, ob es sich wirklich um einen Button handelt; Sicherheitsabfrage
                  if (btnClicked != null)
                  {
                    string tag = btnClicked.Tag.ToString();
                    MessageBox.Show(tag);
                  }
                }
                *-- robert.oh. --*

                Comment


                • #9
                  Das is ja super!!!! DANKE DANKE DANKE!!! Das is genau das was ich brauche!!

                  Comment


                  • #10
                    Tut immer gut zu hoeren, dass man helfen konnte.

                    Schoenen Abend noch!
                    *-- robert.oh. --*

                    Comment


                    • #11
                      Originally posted by robert.oh. View Post

                      Code:
                      private void button_Click(object sender, EventArgs e)
                      {
                        // Aufrufer in den konkreten Typ Button umwandeln
                        Button btnClicked = (Button)sender;
                        // Pruefen, ob es sich wirklich um einen Button handelt; Sicherheitsabfrage
                        if (btnClicked != null)
                        {
                          ..
                        }
                      }
                      Nur noch eine kleine Anmerkung von mir. Wenn sender kein Button ist, gibt es eine InvalidCastException in der Zeile:

                      Code:
                      Button btnClicked = (Button)sender;
                      Deshalb entweder mit try catch schützen oder per as Operator zugreifen. Dieser liefert nämlich tatsächlich null und keine Exception, falls die Umwandlung nicht möglich ist.

                      Code:
                      private void button_Click(object sender, EventArgs e)
                      {
                        // Aufrufer in den konkreten Typ Button umwandeln
                        Button btnClicked = sender as Button;  // !!!!!!!!! #####
                        // Pruefen, ob es sich wirklich um einen Button handelt; Sicherheitsabfrage
                        if (btnClicked != null)
                        {
                          ..
                        }
                      }
                      Gruß
                      Peter

                      Comment


                      • #12
                        Hallo Peter,

                        Ob es tatsaechlich zu einer InvalidCastException kommt trau ich mir nicht hundertprozentig zu sagen, aber in diesem Fall - Click-Event des Buttons - wird ohnehin nur ein Button-Objekt uebergeben.

                        Noch was, in deinem Code schreibst du '... = sender as Button; ... ' das ist das selbe wie '... = (Button)sender; ...'
                        *-- robert.oh. --*

                        Comment


                        • #13
                          Originally posted by robert.oh. View Post
                          Noch was, in deinem Code schreibst du '... = sender as Button; ... ' das ist das selbe wie '... = (Button)sender; ...'
                          Robert,

                          nein das ist es nicht. Wie ich schon geschrieben habe, produziert (Button)sender eine Exception aber der as-Operator liefert null, wenn die Umwandlung fehlschlägt. Daher würde in Deinem Code die Abfrage if (btnClicked!=null) nie greifen, weil die Routine schon in der Zeile vorher mit einer Exception verlassen würde.

                          Gruß
                          Peter

                          Comment


                          • #14
                            Ok Peter, du hast gewonnen
                            Danke fuer die Richtigstellung!
                            *-- robert.oh. --*

                            Comment

                            Working...
                            X