无法在ComboBox中检测到鼠标右键

mar*_*009 6 c# combobox right-click winforms

我有一个简单的下拉式ComboBox.当用户右键单击列表中的某个项目时,我想打开一个新窗口,但是在检测到右键单击时遇到问题.

我的代码:

private void cmbCardList_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right && cmbCardList.SelectedIndex != -1)
    {
        frmViewCard vc = new frmViewCard();
        vc.updateCardDisplay(cmbCardList.SelectedItem);
        vc.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我改变e.Button == MouseButtons.Left,整个事情就会发生.我有什么方法可以按照我的意愿使用它?

o.k*_*k.w 9

我担心,除非你做一些严肃的黑客攻击,否则它将无法实现.该文章将解释.

引用给你:

个人控制

以下控件不符合标准鼠标单击事件行为:

Button,CheckBox,ComboBox和RadioButton控件

  • 左键单击:单击,鼠标单击

  • 右键单击:未单击事件

  • 左键双击:单击,鼠标单击; 单击,鼠标单击

  • 右键双击:没有单击事件


Kei*_*thS 6

作为这个问题的一个墓志铭,您可以使用普通的.NET功能来完成这项工作; 你只需要深入了解事件调用堆栈.而不是处理MouseClick事件,处理MouseDown事件.我最近不得不做类似的事情,我只是覆盖了OnMouseDown方法,而不是附加一个处理程序.但是,处理程序也应该工作.这是代码:

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right && !HandlingRightClick)
        {
            HandlingRightClick = true;
            if (!cmsRightClickMenu.Visible)
                cmsRightClickMenu.Show(this, e.Location);
            else cmsRightClickMenu.Hide();
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        HandlingRightClick = false;
        base.OnMouseUp(e);
    }

    private bool HandlingRightClick { get; set; }
Run Code Online (Sandbox Code Playgroud)

HandlingRightClick属性用于防止OnMouseDown逻辑的多个触发器; UI将发送多个MouseDown消息,这可能会干扰隐藏右键单击菜单.为了防止这种情况,我只在第一个MouseDown触发器上执行一次逻辑(逻辑很简单,我不在乎两个调用是否发生竞争,但你可能),然后忽略任何其他MouseDown触发器,直到发生MouseUp.它并不完美,但这样做可以满足您的需求.