Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Button-EventHandler hinzufügen
CarnifeX
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

Button-EventHandler hinzufügen

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
CarnifeX
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

beantworten | zitieren | melden

@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?
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 520
Herkunft: Münster

beantworten | zitieren | melden

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
            }
        }
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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


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

Sauberer. Noch besser: eigene DynamicButton-Klasse.


LaTino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
hypersurf
myCSharp.de - Member



Dabei seit:
Beiträge: 520
Herkunft: Münster

beantworten | zitieren | melden

Ich wüsste nicht was dagegen spricht, das Tag dafür zu verwenden.
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hypersurf am .
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von hypersurf
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)
private Nachricht | Beiträge des Benutzers
CarnifeX
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16098

beantworten | zitieren | melden

Neues Button-Objekt erstellen...
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
CarnifeX
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

beantworten | zitieren | melden

Das ist mir schon bewusst. Aber wie löse ich das am besten dynamisch?
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers