2

我想在 DataGridView 的右键单击上放置一个上下文相关菜单。我想要从单击的单元格的内容派生的单个菜单项和从数据库中检索的子菜单中可变数量的项目。

我通过在 ContextMenuStrip 打开事件中构建 ToolStripMenuItem 来做到这一点。它有效 - 几乎......

如果我不显示子菜单,因此用户必须单击顶层菜单中的单个项目,一切都很好,但是如果我调用 ShowDropDown 方法来自动显示子菜单,则单击项目时不会触发 exents .

这是我可以生成的最简单的代码来重新创建问题 - 我已经提取了对 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);
    }
}
4

1 回答 1

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());
于 2017-07-11T15:26:01.830 回答