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
添加一个新项,该项仅对一个控件可见。