0

我的应用程序的每个工作区控件都有一个共同点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调试器后,整个方法将离开整个方法,而第一项在 common 中丢失ContextMenuStrip

我该怎么做呢?

4

2 回答 2

0

我已经很久没有使用 WinForms 了,但是你确定你可以一次将同一个Row对象分配给两个不同Strip的 s 吗?

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

我严重怀疑这是否应该按设计工作,因为一行必须与其父级“对话”,并且通过将其添加到另一个条带中,恐怕您正在重新分配父级。

相反,我会在公共菜单中添加一个项目,但Visible属性为false.
然后我会捕捉菜单打开事件并在目标是DataGridViewRow.

于 2012-06-11T10:52:14.297 回答
0

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

a) 创建一个扩展方法

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

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

看你的具体需求,看你的描述看不懂。。。

于 2012-06-11T10:51:34.637 回答