C#DataGridView动态上下文菜单

时间:2012-03-20 09:03:29

标签: c# datagridview contextmenu

我有一个C#DataGridView,显示最多5个计时器的时间。使用DataGridView MouseClick事件,我可以使用“Start Timer”和“Stop Timer”选项创建一个动态的Context菜单。请参阅下面的代码。

我遇到的麻烦是将动态上下文菜单链接到方法。例如,当选择“启动定时器1”时,我需要它来启动第一个定时器,但“启动定时器2”需要启动另一个定时器。我已经有一个方法(非上下文菜单相关)启动相关的计时器,但我不知道如何链接这两个。

我想我需要一个上下文菜单事件,但我有点迷失。

任何帮助都会非常有帮助。

private void dataGridView1_MouseClick(object sender, MouseEventArgs e) 
{     
   if (e.Button == MouseButtons.Right)     
   {         
      ContextMenu m = new ContextMenu();         

      int r = dataGridView1.HitTest(e.X,e.Y).RowIndex;

      m.MenuItems.Add(new MenuItem("Start Timer " + r.ToString()));         
      m.MenuItems.Add(new MenuItem("Stop Timer " + r.ToString()));         

      m.Show(dataGridView1, new Point(e.X, e.Y));      
   }
}

private void StartTimer(int t)
{
   ... code starts the t timer ...
} 

2 个答案:

答案 0 :(得分:0)

您可以像这样处理MenuItem.Click事件:

var item = new MenuItem("Start Timer " + r.ToString();
item.Click += (sender, e) => this.StartTimer(r);
m.MenuItems.Add(item)

如果您想使用MVVM,可以使用Command和CommandParame(http://msdn.microsoft.com/en-us/library/ms752308.aspx)

答案 1 :(得分:0)

在未能完成上述代码工作后,我做了一些更多的研究,现在进行了粗略的研究(见下文)。

我将上下文菜单设置为ContextMenuStrip并链接了ItemClick事件。我找不到将“r”变量传递给StartTimer方法的方法,因此我不得不将其设置为全局,我知道这不是正确的C#方式。我确实尝试让EventHandler运行带有int参数的自定义方法,但是它出现“预期方法名称”错误。

正如我所提到的,我的代码确实有效,但我将不胜感激。

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        int r = dataGridView1.HitTest(e.X, e.Y).RowIndex + 1;

        ContextMenuStrip m = new ContextMenuStrip();

        globals.timer = r;

        m.Items.Add("Start");
        m.Items.Add("Stop");
        m.ItemClicked += new ToolStripItemClickedEventHandler(m_ItemClicked);

        m.Show(dataGridView1, new Point(e.X, e.Y));
    }
}

void m_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    switch (e.ClickedItem.Text)
    {
        case "Start":
            startTimer(globals.timer);
            break;
        case "Stop":
            stopTimer(globals.timer);
            break;
        default:
            break;
    }
}

private void startTimer(int t)
{
    // code here to start timer t
} 

private void stopTimer(int t)
{
    // code here to stop timer t
}

static class globals
{
    public static int timer = 0;
}