Entwickler-Ecke

WinForms - dynamische dropdownlisten und ihre eventhandler


thetemplar_ - Do 27.08.09 10:02
Titel: dynamische dropdownlisten und ihre eventhandler
Hey,
ich hab folgendes Problem:
Ich erstelle dynamisch eine Dropdownliste:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
string[] dirs = Directory.GetDirectories(path);
foreach (string dir in dirs)
{
 dynItem[i] = new ToolStripMenuItem();
 dynItem[i].Text = dir.ToString().Substring(path.Length+1);
 projektAuswählenToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { dynItem[i] });
 dynItem[i].Click += new EventHandler(Form1_Click());
 i++;
}


Jetzt will ich, wenn ein Item angeklickt wird, dieses Item mit einem Harken versehen, also auf ".Checked = true" setzen. Nur wie kann ich die einzelnen Items unterscheiden, da jeder Eintrag die gleiche Funktion aufruft. Kann ich irgendwie Parameter (i) übergeben? Ich hab es nicht hinbekommen, weil es dann eine neue Überladung wäre, da schon 2 Variablen definiert sind (void Form1_Click(object sender, EventArgs e))...

Wie löse ich das Problem, ich hab leider kein Schimmer unter was ich dabei googeln muss...

Danke


raiguen - Do 27.08.09 11:55

Nun, weise jedem ToolStripMenuItem in der Eigenschaft .Tag eine aussagekräftige Bezeichnung zu.
In dem abonierten Event überprüfst du den sender auf DropDownItem -> wenn ja, dann klärst du den Tag und entscheidest dann, was gemacht werden soll

kurzer Gedankenstoss:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
if (sender is DropDownItem)
  {//--.Tag-Eigenschaft ist z.B. als string 
    string ditag = (sender as DropDownItem).Tag.ToString();
    switch (ditag)
      {// hier die case-Anweisungen
      }  
}


Kha - Do 27.08.09 17:46

Zweiter, fortgeschrittener Lösungsweg: Anonyme Methoden (oder Lambdas).


C#-Quelltext
1:
2:
3:
dynItem[i].Click += delegate {
  // Zugriff auf "dir" etc.
};