2010-11-18 82 views
2

我在C#中的Windows窗體中工作。我有一個方法,其中我加入MenuItem S到ContextMenu,我實現了MenuItem S作爲下面的事件處理程序:如何在c#中處理傳遞值的菜單項

public void Form1_Load() 
{ 
    int index =0; 
    ArrayList ar = new ArrayList(); 
    ContextMenu cm = new ContextMenu(); 
    cm.Name = "Test"; 
    MenuItem mi = new MenuItem("All"); 
    mi.Click += new EventHandler(mi_All); 
} 
private void mi_All(object sender,EventArgs e) 
{ 
    //here I want to access the arraylist and integer specified in above method 
} 

如何才能做到這一點?一種可能的解決方案是將ArrayListint聲明爲全局變量,但我有很多像這樣的變量。如果我採取這種方法,變量將存在直到表單被處置。所以這是行不通的。有沒有其他的方式來實現這一點?

+0

問題是,爲什麼你需要訪問數組列表?考慮使用菜單項的標籤屬性來額外存儲。 – 2010-11-18 02:23:21

回答

3

MenuItem有一個Tag屬性,可用於分配您喜歡的任何自定義信息。因此,在調用事件處理程序時,無論您需要訪問什麼,都可以分配給它。在你的例子中,你將分配enu項目的整數索引,然後在事件處理程序中使用它作爲表單級別ArrayList字段的索引。

4

一個選項:

mi.Click += delegate (object sender, EventArgs e) { mi_All(sender, e, ar, index); }; 
... 
private void mi_All(object sender, EventArgs e, ArrayList ar, int index) 
{ 
    ... 
} 

另:

mi.Tag = new object[] { ar, index }; 
... 
private void mi_All(object sender, EventArgs e) 
{ 
    ArrayList ar = (ArrayList)((object[])((MenuItem)sender).Tag)[0]; 
    int index = (int)((object[])((MenuItem)sender).Tag)[1]; 
    ... 
} 
+0

我可以做這個訪問。感謝您的解決方案。同樣,如果我想返回將在事件處理程序方法中更新的索引,則以任何方式存在。請告訴我。 – ASD 2010-11-18 02:56:15