【问题标题】:Unable to detect right mouseclick in ComboBox无法检测到组合框中的鼠标右键单击
【发布时间】:2009-10-17 07:09:46
【问题描述】:

我有一个简单的下拉样式的 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();
    }
}

如果我改变 e.Button == MouseButtons.Left 整个事情就很好了。有什么方法可以让我按我的意愿工作吗?

【问题讨论】:

  • 在我看来,右键单击按钮/组合等是违反直觉的。您可能希望使用另一种方法来执行您想要的操作。使其更实用、更易于实施。
  • 我正在制作的应用程序是一个实用程序,用于处理不再维护但被另一个软件(我没有制作)使用的数据文件。我正在寻找的行为只是在这个其他程序中模拟类似的行为,所以它不应该对任何使用我的应用程序的人来说如此陌生。有另一种方法可以获取我想要显示的对话框,但我现在更感兴趣的是在我的原始应用程序中提供小快捷方式。

标签: c# combobox winforms right-click


【解决方案1】:

恐怕除非您进行一些严重的黑客攻击,否则这将是不可能的。 这个article会解释。

为你引用:

独立控制

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

Button、CheckBox、ComboBox 和 RadioButton 控件

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

  • 右键单击:未引发点击事件

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

  • 右键双击:无点击事件 提出的

【讨论】:

    【解决方案2】:

    作为这个问题的墓志铭,您可以使用正常的 .NET 功能来完成这项工作;您只需要更深入地了解事件调用堆栈。处理 MouseDown 事件,而不是处理 MouseClick 事件。我最近不得不做一些类似的事情,我只是覆盖了 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; }
    

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

    【讨论】:

    • +1 感谢您回答这个问题,即使晚了2年,也是正确的:)
    【解决方案3】:

    您可以使用ContextMenuStripOpening事件来处理右键事件。

    var chk = new CheckBox();
    chk.ContextMenuStrip = cmsNone;
    

    private void cmsNone_Opening(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
        var cms = (ContextMenuStrip)sender;
        var chk = cms.SourceControl;
        //do your stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多