2009-10-17 18 views
4

我有一个简单的下拉样式的组合框。我想在用户右键单击列表中的某个项目时打开一个新窗口,但无法检测到右键单击。无法检测组合框中的鼠标右键

我的代码:

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整个事情触发关就好了。任何方式,我可以得到这个工作,因为我打算?

+3

在我看来,开启/连击等右击是反inituitive。您可能想要使用其他方法执行您想要的操作。使它更实用,也更容易实施。 – 2009-10-17 07:21:33

+0

我正在制作的应用程序是一个实用工具,用于处理不再维护但由另一个软件(我没有制作)使用的数据文件。我正在寻找的行为只是在其他程序中模拟类似的行为,所以对于使用我的应用程序的任何人来说,它都不应该如此陌生。 有一种替代方法来获取我想要显示的对话框,但是我现在更感兴趣的是使我的原始应用程序中的小快捷键可用。 – marco0009 2009-10-17 08:54:41

回答

6

恐怕这不会是posible,除非你做一些严重的黑客攻击。 这个article会解释。

引号处理:

单个控件

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

按钮,复选框,组合框,和单选按钮控制

  • Left cl ICK:点击,鼠标点击

  • 单击右键:没有点击事件引发

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

  • 右键双击: 提出

5

作为墓志铭对这个问题没有点击事件,你可以使用普通的.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; } 

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

+0

+1谢谢你回答这个问题,即使迟了2年,也是对的:) – 2012-03-22 21:30:48

0

您可以使用打开事件ContextMenuStrip来处理右键单击事件。

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 
} 
相关问题