检测c#中的控件点击

时间:2017-01-09 20:29:24

标签: c# winforms datagridview combobox c#-3.0

首先,我想为您描述一下我的问题。

我想在组合框中显示大量记录,但因为组合框不是显示如此大量数据的好方法,因此我使用DataGridView模拟组合框行为。

现在我的问题是当用户单击DataGridView时,应该关闭DataGridView(如没有折叠或丢弃时的组合框)。但是表单上有很多其他控件,我无法处理所有这些控件的click事件,以检测是否已经点击了DataGridView。

总结如果用户点击它,我会为隐形DataGridView寻找一个简单的解决方案。

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

谢谢你

1 个答案:

答案 0 :(得分: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;
    }
}