根据上下文添加/删除事件

本文关键字:删除 事件 添加 上下文 | 更新日期: 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的实现,这将不会在您的示例中调用。如果是一个错别字,那么您只需要根据需要实现处理程序方法。到底是哪个部分坏了?