2017-01-09 54 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