2012-04-07 56 views
1

我正試圖在學習C#時做一些新的事情。我最近發佈了一個類似的問題,直接設置和填充上下文菜單。現在我已經完成了,我發現自己得到了我需要的執行。C#如何使用Windows窗體設置上下文菜單的預設?

我正在創建一個用戶定義的快速訪問列表。它只是一個名字和IP地址。

我從一個XML docmuent填充列表,並通過向上下文菜單:

ToolStripMenuItem.DropDownItems.Add(string name, image, eventargs onClick) 

我在哪裏卡住試圖找出如何告訴click事件什麼IP使用。我知道一個方法參數,我可以通過添加另一個函數參數,如通過IP地址:

doSomething("Hello World"); 

    void doSomething(cmd) 
{ 
messageBox.Show(cmd); 
} 

如何讓我的變量菜單選項,以指示正確的IP地址的名字嗎?我假設如果我可以使用正確的IP,那麼我可以使用相同的方法來使用密碼。 所以我的代碼如下所示:

private void addToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
     ... 
      foreach(xml node in xml doc) 
      { 
      Room r = new Room(); 
      r.Name =xNode.SelectSingleNode("Name").InnerText; 
      r.IP = xNode.SelectSingleNode("IP").InnerText; 
      r.passwrd=xNode.SelectSingleNode("Pass").InnerText; 
      locations.add(r); 
      presetsToolStripMenuItem.DropDownItems.Add(r.Name, null, disp); 
      }  
     } 
void disp(object sender, EventArgs e) 
     { 
      MessageBox.Show(r.Name's IP address); 
      MessageBox.Show(r.Name's password); 
     } 

我不反對使用這樣做的另一種手段。這正是我所能發現的,似乎是最簡單的。我只是想確保它保持簡單,並從XML文檔填充上下文菜單/列表。

+0

我對所有讀這個的人表示歉意。我沒有意識到我沒有包含foreach語句和從xml文檔填充此菜單的事實。我對這個錯誤表示歉意,因爲我認爲這對於這種情況的接近程度有很大不同。 – eatumup 2012-04-10 03:07:39

回答

2

下面是使用DropDownItem的Tag屬性執行此操作的一種稍微難看的方法。

使用代碼:

var item = new ToolStripMenuItem(string name, image, eventargs onClick); 
item.Tag = "your.ip.address"; 
ToolStripMenuItem.DropDownItems.Add(item) 

然後,

private void addToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      var item = sender as ToolStripMenuItem; 
      Room r = new Room(); 
      r.Name ="Name"; 
      r.IP = item.Tag.ToString(); 
      r.passwrd="Password"; 

      presetsToolStripMenuItem.DropDownItems.Add(r.Name, null, disp); 

     } 

不同的可能的解決方案:

我不知道你的類的佈局方式,但你可能想要有一個單獨的查找類來存儲Name-> IP的映射。然後做這樣的事情,

var item = sender as ToolStripMenuItem; 
IPLookuper.GetIP(item.Text);//.Text corresponds to name in "ToolStripMenuItem(string name,..." 

一個查找很容易,只是把項目放在一個詞典。

3編輯

因爲你知道,調用DISP方法的類型,你可以把它像這樣,

void disp(ToolStripMenuItem sender, EventArgs e) 
    { 
    var ip = sender.Tag.ToString(); 
    //Lookup the name/password/whatever based on the IP. 
    MessageBox.Show(r.Name's IP address); 
    MessageBox.Show(r.Name's password); 


    } 

發送對象就是無論什麼階級發射了的情況下,所以你可以投它,如果你知道它是什麼類型。

由於您的實際代碼使用「對象發送者」,因此您只需自己施放它。

void disp(object sender, EventArgs e) 
    { 
    var item = sender as ToolStripMenuItem; 
    var ip = item.Tag.ToString(); 
    //Lookup the name/password/whatever based on the IP. 
    MessageBox.Show(r.Name's IP address); 
    MessageBox.Show(r.Name's password); 

    } 
+0

我可以看到你爲什麼說這將是一個稍微醜陋的方式來做到這一點。我將不得不在運行時創建全局變量。在這一點上,我絕對看到這會變得混亂。 我覺得爲了更加乾淨地實現這一點,我可能不得不改變我的方法。如果是這種情況,那麼更好的方法是什麼? – eatumup 2012-04-08 17:39:14

+0

我想你已經給了我需要的答案。我認爲使用字典將會是一條路。但是我擔心我的理解仍然缺乏能夠連接點的能力。 我想我最需要幫助的地方是在活動期間。當事件執行時,我不知道如何獲得正確的參考。由於名稱和菜單項的所有內容都是動態創建的,我不知道如何調用它的屬性。我怎麼能告訴'eventargs'('disp()')來獲取特定菜單項的'.Name'或'.tag',以便我可以引用字典? – eatumup 2012-04-10 02:54:11

相關問題