如何扩展现有的ContextMenuStrip?

时间:2012-06-11 10:44:27

标签: c# contextmenustrip

我的应用程序的每个工作区控件都有一个公共ContextMenuStrip。 此ContextMenuStrip包含4个项目(“前移”,“后移”和“删除控件”)。

现在我想将它扩展为一个控件。 此控件上有一个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处缺少第一项。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

如果你想在功能上扩展某些控制,你可以

a)创建一个扩展方法

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

b)当你可以根据需要覆盖/添加东西时,创建一个继承自你不满意的控件的新类(甚至创建一个全新的控件)

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

答案 1 :(得分:0)

我多年没有使用过WinForms,但您确定可以同时保留分配给两个不同Row的{​​{1}}对象吗?

Strip

我严重怀疑这应该在设计上有效,因为一行必须与其父级“对话”,并且通过将其添加到另一个条带,我担心你会重新分配父母。

相反,我会在常用菜单中添加一个项目,但foreach (ToolStripMenuItem item in this.ContextMenuStrip.Items) { ctx.Items.Add(item); } 属性添加到Visible
然后,如果目标是false,我会抓住菜单打开事件并使项目可见。