2011-06-15 133 views
0

我正在慢慢獲得C#的掛起,並且此問題可能是由於糟糕的設計造成的,但這裏有。如何從事件處理程序中更改ContextMenuItem的屬性

我已經被正是如此生成的動態菜單:

public Form1() 
{ 
    InitializeComponent(); 
    AddContextMenu(); 
} 
public void AddContextMenu() 
{ 
    ContextMenuStrip mnuContextMenu = new ContextMenuStrip(); 
    mnuContextMenu.ItemClicked+= 
       new ToolStripItemClickedEventHandler(mnuContextMenu_ItemClicked); 

    this.ContextMenuStrip = mnuContextMenu; 

    ToolStripMenuItem mnuItemEnable = new ToolStripMenuItem("Enable"); 
    mnuContextMenu.Items.Add(mnuItemEnable); 
} 

和事件處理程序:

private void mnuContextMenu_ItemClicked (Object sender, 
             ToolStripItemClickedEventArgs e) 
{ 
    //do stuff here 
} 

如何從事件處理程序內部mnuContextMenu.Text(或任何其他財產)的變化? VS說:

mnuContextMenu不在 當前上下文

回答

0

所有事件處理函數方法在.NET世界中都具有完全相同的簽名是有原因的。您可能已經注意到sendere的參數是總是那裏,無論您正在處理哪個事件。他們提供您需要的所有信息。

在這種特殊情況下,您正在查找sender參數,該參數是對引發事件的特定控件的引用。

當然,它的輸入爲Object,所以你必須將它轉換爲更多的派生類型才能像你想要的那樣使用它。這是直接的足夠—因爲你知道,一個ItemClicked事件要由ContextMenuStrip對象募集,只投它直接:

private void mnuContextMenu_ItemClicked (Object sender, ToolStripItemClickedEventArgs e) 
{ 
    ((ContextMenuStrip)sender).Text = "Your text"; 
} 

或者,如果你想發揮它的安全(和你可能做),按照標準的成語:

private void mnuContextMenu_ItemClicked (Object sender, ToolStripItemClickedEventArgs e) 
{ 
    // Try to cast the object to a ContextMenuStrip 
    ContextMenuStrip cmnu = sender as ContextMenuStrip; 

    // Verify that the cast was successful 
    // (if it failed, the cmnu variable will be null and this test will fail, 
    // preventing your code from being executed and your app from crashing) 
    if (cmnu != null) 
    { 
     cmnu.Text = "Your text"; 
    } 
} 

絕對沒有理由垃圾與維護這些對象的類級引用時,有獲得準確的那些引用的一個非常不錯的,內置的方式代碼你想要的時候,當你想要的時候EM。

+0

謝謝。仍然瞭解所有這些演員如何工作。 – csharpidiot 2011-06-15 15:24:59

+0

@csharp:說實話,這實在是一種反常現象。大多數時候,你不應該做非常多的演員。 [泛型](http://msdn.microsoft.com/en-us/library/ms379564.aspx)被引入到C#(以及更一般的.NET框架)的某些版本中,並且它們提供了更好的解決方案問題四處。問題在於事件處理程序簽名是在第一版的基礎上發明的,在泛型存在之前。所以這是您實際上必須定期演出的少數幾個地方之一。 – 2011-06-15 15:26:58

0

mnuContextMenu只有在AddContextMenu範圍存在的存在。

你有兩個選擇:

this.ContextMenuStrip.Text = "Hello World"; 

或:

((ContextMenuStrip) sender).Text = "Hello World"; 

的首部作品,因爲你存儲在本地mnuContextMenu在類屬性格式ContextMenuStrip。第二種方法將發件人參數(引發事件的對象)轉換爲ContextMenuStrip。

+0

你打敗了我。我正要說這個。 – 2011-06-15 14:42:09

0

顯然它失敗了,因爲您將AddContextMenu方法內的上下文菜單對象聲明爲本地方法變量,而不是將其作爲包含類的私有成員。 MegaHerz建議的解決方案可能會起作用,或者您將對象引用爲該類的私有成員。

相關問題