我的应用程序的每个工作区控件都有一个公共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
处缺少第一项。
我该怎么做?
答案 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
,我会抓住菜单打开事件并使项目可见。