Laden...

Button-EventHandler hinzufügen

Erstellt von CarnifeX vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.763 Views
C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren
Button-EventHandler hinzufügen

Guten Morgen,

ich möchte Buttons code-seitig zu meiner Form hinzufügen. Dies klappt auch mit:


Button dynamicbutton = new Button();
pnlPanel1.Controls.Add(dynamicbutton);

Mein Problem: Wie füge ich den eventHandler hinzu??

Der hinzugefügte Button hat ja leider keinerlei funktion also brauche ich ja meinen eventhandler "dynamicbutton_click". Wie füge ich diesen ebenfalls im Code hinzu?

3.003 Beiträge seit 2006
vor 8 Jahren

Drei Möglichkeiten von 5, die mir spontan einfallen:


//als Lambda-Ausdruck
newButton.Click += (s,e) => MessageBox.Show("Clicked");
//als inline-Delegate
newButton.Click += delegate(object s, EventArgs e) 
{  
    MessageBox.Show("Clicked");
};

//mit eventhandling-Methode
newButton.Click += newButton_OnClicked;
public void newButton_OnClicked(object s, EventArgs e)
{
    MessageBox.Show("Clicked");
}

LaTino
Edit: ...und wie fügt man bei Windows.Forms eine Eventhandling-Methode hinzu, ohne deren Code zu schreiben? 🤔

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

@LaTino Danke für die schnelle Antwort!

Ich baue mir nämlich einen "Datei-Sortierer"
Der Grund wofür ich diese Vorgehensweise brauche ist, dass ich mir beliebig viele buttons in meine Form hinzufügen möchte. Jeder Button soll dann auf einen anderen Verzeichnispfad führen in den die Datei verschoben werden kann.

Beispiel:

Mir wird die Datei Test.txt angezeigt.

jetzt habe ich die möglichkeit die bestehenden Buttons zu drücken "Desktop", "Dokumente" oder "neuer Pfad". Bei klick auf "Desktop" wird die datei auf den Desktop verschoben. Bei klick auf "Dokumente" in den Dokumente ordner.

-> das klappt auch alles.

Jetzt möchte ich jedoch bei dem klick auf "neuer Pfad" einen Button in meine Form generieren der auf das verzeichnis meiner wahl verweist. Der button soll dann konstant bestehen bleiben. Und die Funktion "neuer Pfad" soll auch bestehen. bleiben.

Kann ich das so mit LaTinos vorschlag lösen? Oder habe ich einen falschen Ansatz?

H
523 Beiträge seit 2008
vor 8 Jahren

Du hast schon den richtigen Ansatz. Du musst, wie LaTino es beschrieben hat, das Click-Event Deiner dynamisch erzeugten Buttons abonnieren und verabeiten.

Das könnte z. B. so aussehen:


        private void btnAddButton_Click(object sender, EventArgs e)
        {
            this.AddButtonWithDir();
        }

        private void AddButtonWithDir()
        {
            using (FolderBrowserDialog dialog = new FolderBrowserDialog())
            {
                DialogResult result = dialog.ShowDialog();
                if (result == System.Windows.Forms.DialogResult.OK)
                {
                    Button dynamicbutton = new Button();
                    dynamicbutton.Tag = dialog.SelectedPath;

                    DirectoryInfo dirinfo = new DirectoryInfo(dialog.SelectedPath);
                    dynamicbutton.Text = dirinfo.Name;

                    pnlPanel1.Controls.Add(dynamicbutton);
                    dynamicbutton.Click += dynamicbutton_Click;
                }
            }
        }

        private void dynamicbutton_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            if (btn != null && btn.Tag is string)
            {
                string pfad = (string)btn.Tag;
                // mache irgendwas mit dem pfad
            }
        }

3.003 Beiträge seit 2006
vor 8 Jahren

Ouch. Bitte, bitte nicht das Tag für sowas missbrauchen.


dynamicbutton.Click += (sender,args) => DoSomethingWithTheDirectory(dirinfo);

Sauberer. Noch besser: eigene DynamicButton-Klasse.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

H
523 Beiträge seit 2008
vor 8 Jahren

Ich wüsste nicht was dagegen spricht, das Tag dafür zu verwenden.

Ein Object, das Daten über das Steuerelement enthält.Die Standardeinstellung ist null.

Genau das tut das Tag in meinem Beispiel. Es enthält Daten über das Steuerelement, nämlich auf welches Verzeichnis der jew. Button verweist.

Eine eigene Button-Klasse ist definitiv schöner, aber nicht unbedingt notwendig.

3.003 Beiträge seit 2006
vor 8 Jahren

Ich wüsste nicht was dagegen spricht, das Tag dafür zu verwenden.

Dann gebe ich dir gern ein paar Gründe:

  1. Tag ist eine öffentliche Eigenschaft von Button. Du hast nicht die geringste Chance, Zugriffe auf diese Eigenschaft zu prüfen, zu unterbinden oder zu korrigieren. Jeder (einschließlich - versehentlich - du selbst) kann dein Objekt durch ein anderes ersetzen. Wie wäre es mit einem subtilen Bug, der für bestimmte Buttons den im Tag gespeicherten Pfad leicht ändert?

  2. Tag ist generisch "object". Für jeden Zugriff brauchst du ein boxing/unboxing. Du hast zudem nur per Reflection die Möglichkeit, herauszufinden, was drin ist, wenn nicht das drin ist, das du vermutest.

  3. Tag ist eine Eigenschaft der UI (nämlich des Controls Button). Der dort gespeicherte Wert ist aber keine Eigenschaft der UI. Schichtentrennung adé.

  4. Ironischerweise zitierst du selbst, dass Tag dafür gedacht ist, Daten über das Steuerelement zu speichern, und speicherst dann dort eine Information, die keine Information über das Steuerelement ist.

Allein Punkt 1 und 3 sind k.o.-Kriterien für diese - Entschuldigung, aber es ist so - schlampige Herangehensweise.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Danke Hypersurf für deine Antwort.
Mit deiner Variante funktioniert es! Aber nur teilweise.

Der Button funktioniert nur einmal. Beim zweiten verwenden wird kein Button mehr hinzugefügt? Wie kann man das fixen.

16.806 Beiträge seit 2008
vor 8 Jahren

Neues Button-Objekt erstellen...

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Das ist mir schon bewusst. Aber wie löse ich das am besten dynamisch?

1.040 Beiträge seit 2007
vor 8 Jahren

Hast du mal geschaut, was nicht funktioniert?
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Aus meiner Sicht sollte es nämlich ohne Probleme funktionieren...