2

メニューストリップにいくつかのアイテムを動的に追加し、ストリップに追加された各アイテムのトリガーとイベントを実行しました(アイテムはXMLファイルから追加されます)。次にやろうとしているのは、各アイテムのテキストをイベントハンドラーに渡して、スレッドで使用できるようにすることです。これは可能ですか?誰かが解決策を手伝ってくれますか?

これは私のコードです:

private void historyMenuItem_Click(object sender, EventArgs e){
    XmlDocument doc = new XmlDocument();  // create new xml document
    doc.Load("..\\history.xml");  // load the xml
    // create a new node list
    // and select nodes from BookItems/Book
    XmlNodeList nodeList = doc.SelectNodes("URLs/http"); 

    historyMenuItem.DropDownItems.Clear();
    foreach (XmlNode node in nodeList) {
        string page = node.Attributes["page"].Value;
        //http://msdn.microsoft.com/en-us/library/ms160990.aspx
        ToolStripMenuItem windowNewMenu = new ToolStripMenuItem(page, null, new EventHandler(MenuItemClickHandler));
        historyMenuItem.DropDownItems.Add(windowNewMenu);
    }
}

private void MenuItemClickHandler(object sender, EventArgs e){
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
    ## HERE IS WHERE I NEED HELP:
    UrlTextBox = (I need value of page here!);
    this.thread = new Thread(new ThreadStart(this.httpRequestMultiThread));
    this.thread.Start();
}
4

2 に答える 2

4

タグプロパティを使用することをお勧めします。これはオブジェクトなので、使用するときにどのタイプにキャストするかを知る必要があります。このようなもの

private void historyMenuItem_Click(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();  // create new xml document
        doc.Load("..\\history.xml");  // load the xml
        XmlNodeList nodeList = doc.SelectNodes("URLs/http");  // create a new node list
                                                              // and select nodes from BookItems/Book
        historyMenuItem.DropDownItems.Clear();
        foreach (XmlNode node in nodeList)   // for each node in the node list
        {
            string page = node.Attributes["page"].Value;

            ToolStripMenuItem windowNewMenu = new ToolStripMenuItem(page, null, new EventHandler(MenuItemClickHandler));
            windowMenuItem.Tag = page;
            historyMenuItem.DropDownItems.Add(windowNewMenu);
        }
    }
private void MenuItemClickHandler(object sender, EventArgs e)
{
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;

    UrlTextBox.Text = (string)clickedItem.Tag;
    this.thread = new Thread(new ThreadStart(this.httpRequestMultiThread));
    this.thread.Start();
}
于 2012-10-21T21:15:51.990 に答える
1

Tagのプロパティを使用ToolStripMenuItemして、アイテムに関する追加データ(ページの値など)を保存できます。

windowNewMenu.Tag = node.Attributes["page"].Value;

タグのタイプはobject、であるため、値を取得するときにキャストする必要があります。

ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
string page = clickedItem.Tag as string;

ただし、現在のソリューションでは、ページの値はメニュー項目のプロパティに割り当てられてTextいます(項目を作成するとき)。したがって、そのプロパティから値を取得できます。

string page = clickedItem.Text;
于 2012-10-21T21:14:25.917 に答える