web-dev-qa-db-ja.com

C#動的にイベントハンドラーを追加する

こんにちは私は簡単な質問があります。これが私のコードです:

        XmlDocument xmlData = new XmlDocument();
        xmlData.Load("xml.xml");

        /* Load announcements first */
        XmlNodeList announcements = xmlData.GetElementsByTagName("announcement");

        for (int i = 0; i < announcements.Count; i++)
        {
            ToolStripMenuItem item = new ToolStripMenuItem();

            item.Name = announcements[i].FirstChild.InnerText;
            item.Text = announcements[i].FirstChild.InnerText;

            /* HERE IS WERE I NEED HELP */

            item.Click += new EventHandler();

            this.freedomMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { item });
        }

Xml LastChildは、各アナウンスメントの情報を保持します。リストアイテムをクリックすると、メッセージボックスにデータが表示されるクリックイベントハンドラーを作成します。私の問題は、これを行うためにイベントハンドラを動的に生成する方法がないことです:(

21
Tony

試してください:

 /* HERE IS WERE I NEED HELP */

 item.Click += new EventHandler(toolStripClick);

実際のハンドラー:

void toolStripClick(object sender, EventArgs e)
{
     ToolStripItem item = (ToolStripItem)sender;
     MessageBox.Show(item.Text);
}    
39
TheVillageIdiot

ToolStripMenuItemのTagプロパティを使用できます。

item.Tag = Announcements[i].LastChild.InnerText;

public void item_click(object sender, EventArgs e)
{
    var menu = sender as ToolStripMenuItem;
    if (menu!= null)
        MessageBox.Show(menu.Tag);
}

または、変数を取得するラムダを使用することもできます。

string data = Announcements[i].LastChild.InnerText;
item.Click += (s, e) => { MessageBox.Show(data); };
6
Steven Robbins

まあ、私があなたの質問を正しく理解していれば、「助けが必要」セクションは次のようになるはずです。

item.Click += new EventHandler(item_click);

次に、クラスに関数を追加するだけです。

public void item_click(object sender, EventArgs e)
{
   //do stuff here
}
2
Streklin

クリックイベントの署名を求めていますか?あなたがビジュアルスタジオで働いているなら、あなたはタイプすることができるはずです

item.Click + =タブタブ

そしてそれはあなたのために何かを生成します

2
lincolnk

イベントのサブスクリプションを調べることをお勧めします。イベントでは、それがメニュー項目の最後の項目であることを確認する必要があります。
アイテムについては、MSDNのヘルプを参照してください

0
mcauthorn