2017-01-09 56 views
2

首先,我想为你描述我的问题。检测点击c中的控件#

我想在类似combobox的东西中显示大量记录,但是因为combobox不是显示如此巨大数据量的好解决方案,所以我模拟了DataGridView的组合框行为。

现在我的问题是,当用户点击DataGridView时,DataGridView应该关闭(就像它没有折叠或丢弃时的组合框)。但是窗体上有很多其他的控件,我不能处理所有这些事件的点击事件,以检测出DataGridView已被点击。

总结我寻找一个简单的解决方案,用于隐藏DataGridView如果用户点击失控。

在最后,我知道控件的MouseCapture属性的模糊认识,但我不能使用它,我不知道如何使用它来处理我的愿望。我很感激你,如果你可以帮助我使用MouseCapture for解决这个问题或给出另一种解决方案

感谢您

+0

显然失去了重心,离开心不是我的asnwer – hamed

+0

我认为ComboBox控件的下拉部分实际上是从文本框中一个单独的窗口。您可以尝试类似的方法:在独立的专用窗口中显示DataGridView,并在停用该窗口时隐藏该窗口。 – adv12

+0

也许有一个简单的解决方案,但我在WinForms中有点生疏,所以现在只能建议像http://stackoverflow.com/questions/4991044/winforms-intercepting-mouse-event-on-mainform -first-not-on-controls –

回答

1

自定义控件应该使这个相当简单,尤其是如果这是一个顶级的控制(即直接在主窗口中)。您可以侦听父对象上的单击事件,并使用ClientRectangle属性来确定单击是否在DataGridView之外。

这里有一个基本的例子:

class MyDataGridView : DataGridView, IMessageFilter { 
    public MyDataGridView() { 
     Application.AddMessageFilter(this); 
     this.HandleDestroyed += (sender, args) => Application.RemoveMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x201) { 
      if (!ClientRectangle.Contains(PointToClient(Control.MousePosition))) { 
       Hide(); 
      } 
     } 
     return false; 
    } 
} 
+0

亲爱的@Peter我测试你的解决方案,我再次面对我的问题。我说我的窗体上有几个Control,正如你所说我创建了一个自定义控件并把它放在窗体上,但是因为我们监视Parent.MouseClick只有当你点击父窗体时,我们检测到点击自定义控件,并且如果用户点击父窗体自定义控件上的其他控件不会感觉到该点击。 – hamed

+0

Hi @Hamed,我现在明白了。我认为这个新版本应该工作 – Peter

+0

亲爱的@pete这个新的解决方案正常工作。你很棒。 – hamed