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

时间:2013-04-11 11:52:26

标签: c# winforms events

我是C#和WinForms的新手。我有一些右键单击(上下文菜单)事件的对象。但是,根据上下文(例如,取决于用户是在向导屏幕还是主屏幕中),我想改变右键单击的内容。我用Google搜索了一下,发现我可以使用+=-=运算符,但我仍然无法实现我想要做的事情。给出下面的代码,例如,

有什么想法吗?

编辑:我希望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));
}

3 个答案:

答案 0 :(得分:1)

您是说要根据单击时的情况更改上下文菜单的内容?如果是这样,最简单的方法是创建多个上下文菜单,只需使用一个事件来设置您想要的任何上下文菜单。

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;

希望这有帮助。

答案 1 :(得分:0)

+=-=应该可以正常工作,但我建议你使用一种处理器仓库来切换要使用的处理程序。这应该像strategy模式一样工作,其中不同的向导步骤将是不同的策略。

如果您向我们展示一些代码并指出哪些代码部分无法正常工作,那么帮助您会更容易。

答案 2 :(得分:0)

您似乎建议您根据具体情况添加不同的处理程序:

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的实现,在您的示例中不会调用它。如果是拼写错误,那么您只需要根据需要实现处理程序方法。究竟什么部分不起作用?