根据上下文添加/删除事件
本文关键字:删除 事件 添加 上下文 | 更新日期: 2023-09-27 18:08:32
我是c#和WinForms的新手。我有一些对象与右键单击(上下文菜单)事件。但是,根据上下文(例如,根据用户是在向导屏幕中还是在主屏幕中),我想更改右键所做的操作。我搜索了一下,发现我可以使用+=
和-=
操作符,但我仍然无法实现我想要做的。给定下面的代码,例如
有什么想法吗?
编辑:我希望OnClickCard
在不同的地方表现不同。
Sammple代码:
public override ContextMenuStrip GetContextMenuStrip(GoView view)
{
if (Selectable)
{
ContextMenuStrip contextMenu = new ContextMenuStrip();
if (!Empty)
{
// this is just for example so not showing the implementation
contextMenu.Items.Add(new ToolStripMenuItem(
"Delete",
null,
new EventHandler(OnClickDelete)));
}
// Empty
else
{
ToolStripMenuItem addCard = new ToolStripMenuItem("Add");
foreach (..some data..)
{
ToolStripMenuItem card = new ToolStripMenuItem(
data,
null,
new EventHandler(OnClickCard));
addCard.DropDownItems.Add(card);
}
}
}
else
{
return null;
}
}
private void OnClickCard(object sender, EventArgs e)
{
ToolStripMenuItem cardItem = (ToolStripMenuItem)sender;
if (cardItem.Text.Contains("ABC"))
{
Common.Forms.FormMMUSettings f = new FormMMUSettings(cardItem.Text,ParentMagazine.NextSite);
f.Show();
}
SetCard(new MagazineCard(2, cardItem.Text));
}
您是说要根据单击上下文菜单时的情况更改上下文菜单的内容吗?如果是这样,最简单的方法是创建多个上下文菜单,并使用一个事件来设置您想要的上下文菜单。
ContextMenu menu1 = new ContextMenu();
MenuItem menu1Item1 = new MenuItem();
menu1Item1.Header = "Menu 1 Item 1";
menu1Item1.Click += new RoutedEventHandler(menu1Item1Clicked);
menu1.Items.Add(mnu1Item1);
MenuItem menu1Item2 = new MenuItem();
menu1Item2.Header = "Menu 1 Item 2";
menu1Item2.Click += new RoutedEventHandler(menu1Item2Clicked);
menu1.Items.Add(menu1Item2);
ContextMenu menu2 = new ContextMenu();
MenuItem menu2Item1 = new MenuItem();
menu2Item1.Header = "Menu 2 Item 1";
menu2Item1.Click += new RoutedEventHandler(menu2Item1Clicked);
menu2.Items.Add(menu2Item1);
MenuItem menu2Item2 = new MenuItem();
menu2Item2.Header = "Menu 2 Item 2";
menu2Item2.Click += new RoutedEventHandler(menu2Item2Clicked);
menu2.Items.Add(menu2Item2);
public void menu1Item1Clicked(object sender, EventArgs e)
{
}
etc..
现在你可以使用:
设置你需要的菜单myForm.ContextMenu = menu1;
+=
和-=
应该工作得很好,但我建议你使用一种处理程序的回购,你会切换处理程序使用。这应该像一个策略模式,不同的向导步骤将是不同的策略。
如果你能给我们看一些代码,并指出哪些代码部分不能正常工作,这将更容易帮助你。
您似乎建议您希望根据上下文附加不同的处理程序:
if(that)
obj.event += HandleThat;
else
obj.event += HandleSomethingElse;
这应该可以工作,但您也可以在一个处理程序中完成:
obj.event += HandleAll;
void HandleAll(object sender, EventArgs arg) {
if(that)
HandleThat();
else
HandleSomethingElse();
}
编辑:好吧,你编辑过的问题确实有别的意思。
第一个明显的问题是,您添加OnClickDelete
作为处理程序,并显示OnClickCard
的实现,这将不会在您的示例中调用。如果是一个错别字,那么您只需要根据需要实现处理程序方法。到底是哪个部分坏了?