我想在右键单击DataGridView上放置一个上下文相关菜单。我希望从单击的单元格的内容和从数据库中检索的子菜单中的可变数量的项目中获得单个菜单项。
我是通过在ContextMenuStrip Opening事件中构建ToolStripMenuItem来实现的。它有效 - 差不多......
如果我不显示子菜单,那么用户必须单击顶级菜单中的单个项目,一切都很好但是如果我调用ShowDropDown方法自动显示子菜单,则当项目时不会触发点击。
这是我可以用来重新创建问题的最简单的代码 - 我已经删除了对DataGridView和数据库的所有引用,因此我的“动态”菜单显然是静态的; - )
如果您将此设置为表单定义,请右键单击表单上的任意位置,您将看到工作但不是所需的行为 - 单击子菜单并查看弹出窗口。勾选复选框并再次右键单击,您将看到子菜单自动飞出 - 但单击项目不会触发aliasClick处理程序。
有什么想法?在这个特定的应用程序中,我可以编写一个完美的可服务的解决方法,避免使用ShowDropDown - 但我想知道我做错了以防万一我将来需要使用它。
public partial class Form1 : Form
{
private ContextMenuStrip cms;
private CheckBox chkAuto;
public Form1()
{
InitializeComponent();
chkAuto = new CheckBox();
Controls.Add(chkAuto);
cms = new ContextMenuStrip();
cms.Opening += contextMenuStrip1_Opening;
this.MouseClick += Form1_MouseClick;
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
cms.Show(Cursor.Position);
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
cms.Items.Clear();
ToolStripMenuItem tsmi = new ToolStripMenuItem("Title from datagridviewcell");
tsmi.DropDownItems.Add(new ToolStripMenuItem("First item from database lookup", null, aliasClick));
tsmi.DropDownItems.Add(new ToolStripMenuItem("Second item from database lookup", null, aliasClick));
tsmi.DropDownItems.Add(new ToolStripMenuItem("Last item from database lookup", null, aliasClick));
cms.Items.Add(tsmi);
if (chkAuto.Checked)
tsmi.ShowDropDown();
e.Cancel = false;
}
private void aliasClick(object sender, EventArgs e)
{
ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
MessageBox.Show(clickedItem.Text);
}
}
答案 0 :(得分:0)
我不完全确定如何证明这一点,但我怀疑你对tsmi.ShowDropDown()
的调用会以某种方式导致点击处理程序无法正确捕获坐标。将其替换为cms.Show(MousePosition)
即可。
也许从坐标看一些有用的信息......
var mi = new ToolStripMenuItem("First item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi);
var mi2 = new ToolStripMenuItem("Second item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi2);
var mi3 = new ToolStripMenuItem("Last item from database lookup", null, aliasClick);
tsmi.DropDownItems.Add(mi3);
cms.Items.Add(tsmi);
if (chkAuto.Checked)
tsmi.ShowDropDown();
//cms.Show(MousePosition);
Debug.WriteLine(mi.Bounds.ToString());