Laden...

Buttons dynamisch erzeugen

Erstellt von oli001 vor 17 Jahren Letzter Beitrag vor 22 Tagen 10.403 Views
O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 17 Jahren
Buttons dynamisch erzeugen

Hallo,

ich bekomme aus einer Datenbank eine Tabelle mit Eigenschaften. nun möchte ich anhand dieser Tabelle Buttons anlegen (dynamisch).
Wie kann ich das machen? Wenn ich mir einen Button erzeuge wird der nicht angezeigt, weder mit show, noch mit dispose?
Kann mir da jemend einen Tipp geben?

Vielen Dank, Oli

Viele Grüße, Oli

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

Controls.Add (myButton)

herbivore

187 Beiträge seit 2005
vor 17 Jahren

die Forumlarklasse hat eine Eigenschaft. Nennt sich "Controls" ist vom Typ ControlCollection. Da musst du die buttons via .Add(...) hinzufügen.

Beispiel:


Form1_Load(object seinder, EventArgs e)
{
Button btn = new Button();
btn.Text = "Hallo";
this.Controls.Add(btn);
}
O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 17 Jahren

Hi,


                Button x = new Button(); 
                x.Name = areas[1].ToString();
                x.Show();
                Controls.Add(x);

Klappt auch nicht.... 🙁

Viele Grüße, Oli

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

du musst noch die Position festlegen und auch dafür sorgen, dass es nicht vielleicht hinter einem anderen Control verdeckt ist.

herbivore

PS: Siehe auch: Control wird nicht angezeigt

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

noch mit dispose?

🤔

Button myBtn = new Button();

Button myButton = new Button();
            myButton.Name = "myDynamicButton";
            myButton.Size = new Size(192, 32);
            myButton.Location = new Point(0, 0);
            myButton.Text = "Dynamischer Button";
            this.Controls.Add(myButton);

Funktioniert auf jeden Fall. Ansonsten kannst du dir gerne mal die .Designer.cs anschauen um zu sehen, was alles festgelegt wird, wenn du ein neues Control im Designer deiner Form hinzufügst.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 17 Jahren

Danke,

haut hin. Jetzt ist das Problem dass ich ja mehrere Buttons brauche. Ich weiß aber vorher nicht wie viele. Gibt es irgendwie ein Collection, in die man Buttons dynamisch reinwerfen kann??

Danke Oli

Viele Grüße, Oli

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

List<Button>

herbivore

O
oli001 Themenstarter:in
449 Beiträge seit 2005
vor 17 Jahren

Hallo,

habe noch eine Frage zu dem Thema. Die Buttons sind nun angeordnet, aber wie kann ich nu den einzelnen Buttons eine Funktion zuweisen. Also wie wissen die Buttons was sie tun sollen, wenn sie gedrückt werden??

Danke Oli

Viele Grüße, Oli

2.082 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

solch Dinge sind eigentlich Basiswissen welches du dir selbst aneignen solltest.

Ich sage nur Button.Click den Rest musst du selbst rausfinden.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo oli001,

ich stimme frisch zu. Trotzdem noch ein kleiner Hinweis. Du kannst bei allen Buttons den gleichen EventHandler registrieren. Wenn der EventHandler aufgerufen wird, wird im ersten Parameter der Button übergeben, der geklickt wurde.

Alles weitere in: Galileo <openbook>: Visual C# 2005 von Andreas Kühnel

herbivore

C
25 Beiträge seit 2014
vor 3 Monaten

Hallo herbivore,

nachdem ich den Sonntag vergebens mit internetrecherche verbracht habe, stoße ich nun auf diesen Thread, der (16 Jahre später) mein Problem trifft. Offensichtlich hatte aber Oli001 nicht 'meine' Probleme.

In einem Windows Forms Projekt habe ich ein Control erstellt (myButton) welches einen standard Button enthält und daneben etwas zusätzliche Design-Dinge. Diesen MyButton möchte ich nun testweise in einem kleinen Prüfprogramm per Button.Click in eine SlideBar einfügen. Das klappt alles problemlos. Nach jedem Butto.Click erscheint wunschgemäß der neue, zusätzliche Button.

Mein Problem besteht darin, dass ich es nicht schaffe die Events von MyButton zu nutzen. Alle Varianten mit den Button events umzugehen die ich hier fand bleiben ohne funktion bei mir - sprich, auf ein MyButton.Click erfolgt nicht die gewünschte Reaktion. Letzte Version meiner Tests ist folgende, in der ich eine Ausgabe 'BuildSlideBar' im Debugfenster erhalte, aber wenn ich dann den eigenen 'SlideBarButton' drücke, kommt keine Ausgabe im Debugfenster von VS.

        private void BuildSlideBar(List <SlideBarButton> buttonList)
        {
            Debug.WriteLine("BuildSlideBar");
            foreach (SlideBarButton sbb in buttonList)
            {
                slideBar.Controls.Add(sbb);
//                sbb.Click += (object s, EventArgs e) => { Debug.WriteLine("Test "); };
                sbb.Click += (s, e) => { MessageBox.Show( sbb.Name + sbb.ButtonText); };

            }
            slideBar.Refresh();
        }

Ich habe einige Berichte gefunden, dass beim dynamische Anlegen von Controls, also zur Laufzeit, schwierigkeiten mit den Events macht. Wennich die Buttons nicht dynamisch zur Laufzeit, sondern vorab im Designer anlege, geht ja alles wunderbar.

Hast Du einen Tip(p) für mich, wie ich das Problem lösen kann?

Grüße

Christian

C
25 Beiträge seit 2014
vor 3 Monaten

Es hat sich gelöst.

Möglicherweise verwirrt durch die vielen Internetbeiträge habe ich wohl schlicht den falschen Weg versucht gangbar zu machen.

Durch das Erstellen eines eigenen Click Events in meiner 'Control', welches durch das Click-Event der im Control befindlichen Button ausgelöst wird ist nun auch im Testprogramm mein eigenes Click-Event verfügbar und wird, wie gewünscht, ausgelöst.

Thema geschlossen.

1.820 Beiträge seit 2005
vor 22 Tagen

Hallo,

evtl. noch als Ergänzung:

herbivore hatte ja bereits erwähnt, dass ein allgemeiner EventHandler erstmal ausreicht, da der erste Parameter (sender) ja die Button-Instanz zurück gibt.

Um nun zu wissen, um welchen Button es sich handelt, kann man entweder den Namen prüfen oder man verwendet die Tag-Eigenschaft des Buttons bei Erstellung, um dort weitere Informationen abzulegen, welche dann im EventHandler entsprechend verwendet werden können.

private void GlobalEventHandlerForButtonClick(object sender, EventArgs e)
{
  if (sender is Button button)
  {
    if (button.Name == "dynamicButton1")
    {
      // Code to handle click event for dynamicButton1
    } else 
      if (button.Tag != null) 
      {
        // Check data in button.Tag
      }
  }
}

Nobody is perfect. I'm sad, i'm not nobody 🙁