C# 如何扩展现有的ContextMenuStrip?

C# 如何扩展现有的ContextMenuStrip?,c#,contextmenustrip,C#,Contextmenustrip,对于应用程序的每个工作区控件,我都有一个通用的ContextMenuStrip。 此ContextMenuStrip包含4项(“向前移动”、“向后移动”和“删除控件”) 现在我想为一个控件扩展它。 此控件上有一个DataGridView,我需要一个附加项来删除选定的DataGridView行 这是我尝试的代码: private void extendContextMenuOfDataGridViewRow (DataGridViewRow row) { ContextMe

对于应用程序的每个工作区控件,我都有一个通用的
ContextMenuStrip
。 此
ContextMenuStrip
包含4项(“向前移动”、“向后移动”和“删除控件”)

现在我想为一个控件扩展它。 此控件上有一个
DataGridView
,我需要一个附加项来删除选定的
DataGridView行

这是我尝试的代码:

    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
中缺少第一项


我怎样才能做到这一点呢?

如果您想从功能上扩展某些控件,您可以

a) 创建一个扩展方法

public void DoSomething(this MyExtendedControl mec, DataGridViewRow row)
{
}
b) 当您可以根据需要重写/添加内容时,创建一个从您不满意的控件继承的新类(甚至创建一个全新的控件)


取决于您的具体需要,无法从您的描述中理解…

我已经很久没有使用WinForms了,但是您确定可以将相同的
对象同时分配给两个不同的
条带

foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) {
    ctx.Items.Add(item);
}
我严重怀疑这种设计是否可行,因为一行必须与它的父行“对话”,而将它添加到另一个条带中恐怕是在指定父行

相反,我会将一个项目添加到公共菜单中,但是将其
可见的
属性添加到
false


然后,如果目标是
DataGridViewRow

“向前移动”、“向后移动”和“删除控件”=3项,而不是4项,我将捕获菜单打开事件并使该项可见。您到底想实现什么?您想在事件发生时向ContextMenuStrip中添加一个MenuItem吗?我将[separator]作为第四项编写(但与html标记类似)。我想这就是它消失的原因。我想将扩展的
ContextMenuStrip
设置为参数的
对象。此
对象此时没有任何
ContextMenuStrip
。我要扩展的
ContextMenuStrip
来自包含
DataGridView
的控件。我看到的是您正在获取一个现有的
ContextMenuStrip
并创建一个新的(
ctx
)。在C#中没有“扩展”对象这样的事情。我的观点是,如果您将
项添加到
ctx
,它们可能会从原始项中消失。因此,您最好将相同的上下文菜单条同时分配给行和其他控件,并根据上下文显示/隐藏“删除行”项。我不知道如何使用扩展方法解决我的问题。@pinki,也许可以尝试更好地解释您的问题。。。似乎我不是唯一一个没有得到它的人。我想向现有的
ContextMenuStrip
添加一个新项,该项仅对一个控件可见。