2012-06-11 40 views
0

我對我的應用程序的每個工作區控制都有一個共同的ContextMenuStrip。 這個ContextMenuStrip包含4個項目(「前移」,「移回」和「刪除控制」)。如何擴展現有的ContextMenuStrip?

現在我想擴展它爲一個控件。 這個控件上有一個DataGridView,我想要一個額外的項目來刪除所選的DataGridViewRow

這是我試過的代碼:

private void extendContextMenuOfDataGridViewRow (DataGridViewRow row) { 
     ContextMenuStrip ctx = new ContextMenuStrip(); 
     foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) { 
      ctx.Items.Add(item); 
     } 
     ctx.Items.Add(new ToolStripSeparator()); 
     ToolStripMenuItem ctxDeleteRow = new ToolStripMenuItem("Delete row"); 
     ctxDeleteRow.Name = "ctxDeleteRow"; 
     ctxDeleteRow.Click += new EventHandler(ctxDeleteRow_Click); 
     ctx.Items.Add(ctxDeleteRow); 

     row.ContextMenuStrip = ctx; 
    } 

foreach循環的第一項加入ctx.Items調試離開整個方法的第一個項目是在公共ContextMenuStrip失蹤。

我該怎麼做?

+0

「Move front」,「move back」和「delete control」= 3項,而不是4. – walther

+0

你究竟想要達到什麼目的?事件發生時,你想添加一個MenuItem到你的ContextMenuStrip? –

+0

我寫了[分隔符]作爲第四項(但像html標籤)。我認爲這就是它消失的原因。 – pinki

回答

0

如果你想要一些控制的功能擴展,您可以

一)創建一個擴展方法

public void DoSomething(this MyExtendedControl mec, DataGridViewRow row) 
{ 
} 

B)創建一個新的類從您不滿意控制繼承(甚至創造一個全新的控制),根據需要

要看您的具體需要時,你可以重寫/添加的東西,無法從你的描述瞭解...

+0

我不明白如何爲我的問題使用擴展方法。 – pinki

+0

@pinki,也許試圖更好地解釋你的問題......似乎我不是唯一一個不明白的人。 – walther

+0

我想添加一個新的Item到一個現有的'ContextMenuStrip',它只對一個控件可見。 – pinki

0

我還沒有與WinForms合作多年,但是您確定可以同時將同一個對象分配給兩個不同的Strip s嗎?

foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) { 
    ctx.Items.Add(item); 
} 

我嚴重懷疑這應該由設計工作,因爲一排有「對話」到其父,並通過將其添加到另一個帶我怕你重新分配父。

相反,我會添加一個項目到普通菜單,但與其Visible屬性到false
然後,如果目標是DataGridViewRow,我將捕獲菜單打開事件並使項目可見。

+0

我想將擴展的'ContextMenuStrip'設置爲參數的'Row'對象。這個'Row'對象此時沒有任何'ContextMenuStrip'。我想擴展的'ContextMenuStrip'來自包含'DataGridView'的控件。 – pinki

+0

我看到的是您正在*現有的*'ContextMenuStrip'並創建一個*新的*('ctx')。在C#中沒有「擴展」對象的東西。我的觀點是,如果你將'添加'項目添加到'ctx',他們可能會從原來的項目中消失。所以你最好有**相同的上下文菜單條**分配*行*和其他控制,並顯示/隱藏「刪除行」項取決於上下文。 –

+0

我會嘗試。 謝謝! – pinki