C#DataGridView动态上下文菜单
本文关键字:菜单 上下文 动态 C#DataGridView | 更新日期: 2023-09-27 18:28:16
我有一个C#DataGridView,它可以显示多达5个计时器的计时。使用DataGridView鼠标点击事件,我可以创建一个动态上下文菜单,选项为"启动计时器"answers"停止计时器"。请参阅下面的代码。
我遇到的问题是将动态上下文菜单链接到一个方法。例如,当选择"启动计时器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 ...
}
您可以处理MenuItem。点击如下事件:
var item = new MenuItem("Start Timer " + r.ToString();
item.Click += (sender, e) => this.StartTimer(r);
m.MenuItems.Add(item)
如果要使用MVVM,也可以使用Command和CommandParameters(http://msdn.microsoft.com/en-us/library/ms752308.aspx)
在未能使上述代码正常工作后,我做了更多的研究,现在有了一个粗略的解决方案(见下文)。
我将上下文菜单设置为ContextMenuStrip,并链接了ItemClick事件。我找不到将"r"变量传递给StartTimer方法的方法,所以我不得不将其设置为全局变量,我知道这不是正确的C#方法。我确实尝试让EventHandler运行一个带有int参数的自定义方法,但它错误为"Method Name Expected"。
正如我所提到的,我的代码确实有效,但如果有更多建议,我将不胜感激。
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;
}