在C#中检测出控件之外的单击

ham*_*med 5 c# combobox datagridview winforms c#-3.0

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

我想在诸如combobox之类的示例中显示大量记录,但是由于combobox并不是显示大量数据的好方法,因此我使用DataGridView模拟了combobox的行为。

现在我的问题是,当用户从DataGridView中单击时,应关闭DataGridView(如组合框未折叠或掉落时)。但是窗体上还有许多其他控件,我无法处理所有这些控件的click事件,以检测出DataGridView中是否已单击。

总结一下,如果用户单击该按钮,我将为隐形DataGridView寻找一个简单的解决方案。

最后我知道控件的MouseCapture属性含糊不清,但是我不能使用它,也不知道如何使用它来满足我的愿望。如果您能帮助我使用MouseCapture解决此问题,提供另一种解决方案。

谢谢你

Pet*_*ter 4

自定义控件应该使这变得相当简单,特别是如果这是一个顶级控件(即直接在主窗口中)。您可以侦听父对象上的单击事件,并使用该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;
    }
}
Run Code Online (Sandbox Code Playgroud)