Laden...

Dynamisch erzeugte Menü-Einträge: Im Eventhandler erkennen, welcher geklickt wurde

Erstellt von maxwell86 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.184 Views
M
maxwell86 Themenstarter:in
32 Beiträge seit 2010
vor 13 Jahren
Dynamisch erzeugte Menü-Einträge: Im Eventhandler erkennen, welcher geklickt wurde

Hallo zusammen,

ich möchte in meinem Programm die Funktion "Öffnen"->"Letzte Dateien" realisieren.
Wenn ich eine Datei öffne, wird diese in ein Array gespeichert, das zu Beginn des Programmstarts geladen wird (aus .ini-Datei oder Settings). Für jeden Array-Eintrag lasse ich einen Eintrag in das Startmenü setzen. Für jeden dieser Einträge muss ich dann ja ein Click-Event verbinden, in dem dann die jeweilige Datei geöffnet wird. Leider weiß ich nicht, wie ich denn den Dateinamen übergeben kann! Woher weiß ich, welcher Button geklickt wurde?

Hier der Code:


foreach (String f in files)
{
     if (f != "")
     {             
          letzeBilderToolStripMenuItem.DropDownItems.Add(f);
          letzeBilderToolStripMenuItem.DropDownItems[i].Click += new EventHandler(openLast);
     }
}

private void openLast(object sender, EventArgs e)
{
     openFile(Dateiname);
}

Wie kann ich das jetzt also schaffen, der openLast-Funktion einen Parameter zu übergeben?

Danke euch!

K
62 Beiträge seit 2009
vor 13 Jahren

Über den sender des Events kommst du an das entspr. ToolStripItem das den Dateinamen enthält (bei deinem Beispielt kämst Du so z.B. über das Text-Property an den Dateinamen)

    ToolStripItem item =  fileToolStripMenuItem.DropDownItems.Add("Dateiname");
    item.Click += new EventHandler(item_Click);
}

void item_Click(object sender, EventArgs e)
{
    ToolStripItem srcItem = sender as ToolStripItem;

    if (srcItem != null)
    {
        MessageBox.Show(srcItem.Text);
    }
}
M
maxwell86 Themenstarter:in
32 Beiträge seit 2010
vor 13 Jahren

ja super stark! Vielen, vielen Dank für die schnelle Hilfe! Das mit dem "as" checke ich zwar, weiß aber nie dass ich das hernehmen kann! DANKE!

5.299 Beiträge seit 2008
vor 13 Jahren

OT:

kleine Anmerkung: [Tipp] Casten aber richtig: Begriffe wie Cast / is / as

Ich empfehle ganz allgemein, wo möglich (wie hier), den herkömmlichen ("harten") Cast einzusetzen.
Damit erhältst du eine InvalidCast-Exception, wenn die Umwandlung nicht möglich ist, und das ist hochwillkommen.

Ein "weicher" Cast gäbe nur null zurück, und wenn du das nicht testest, rennst du an der nächsten Ecke in eine ArgumentNull-Exception, und dann kannst du erst mal suchen...

In Kileaks Beispiel wird zwar getestet, aber wenn der Cast nicht funktioniert passiert einfach gar nichts.
Also der User kann klicksen und klicksen, und geht nix - das kanns ja auch nicht sein.


void item_Click(object sender, EventArgs e)
{
    var srcItem = (ToolStripItem)sender;   //kein test - Exception ist willkommen zum Debuggen
    MessageBox.Show(srcItem.Text);
}

Der frühe Apfel fängt den Wurm.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo maxwell86,

im konkreten Fall mag es dir rechen, wenn du srcItem._Text_ kennst, aber im Allgemeinen ist es flexibler srcItem._Tag_ zu benutzen, um einen Menüeintrag mit bestimmten Daten/Informationen zu verknüpfen. Da die Tag-Property vom Typ Object ist, muss man beim Zugriff natürlich auch wieder Casten.

herbivore