2017-01-09 5 views
2

Für den Anfang möchte ich mein Problem für Sie beschreiben.Detect Klick aus der Steuerung in C#

Ich möchte eine riesige Anzahl von Datensätzen in so etwas wie Combobox zeigen, aber weil Combobox keine gute Lösung für die Anzeige einer so großen Anzahl von Daten ist, simuliere ich Combobox-Verhalten mit DataGridView.

Jetzt ist mein Problem, wenn Benutzer aus DataGridView klicken, sollte DataGridView geschlossen werden (wie Combobox, wenn es nicht reduziert oder gelöscht wird). Aber es gibt eine Menge anderer Kontrolle über das Formular und ich kann nicht Click-Ereignis von allen von ihnen zu erkennen, dass von DataGridView geklickt wurde.

zusammenfassend Ich suche nach einer einfachen Lösung für unsichtbare DataGridView, wenn Benutzer klicken Sie darauf.

am Ende kenne ich ein vages Bewusstsein der MouseCapture-Eigenschaft von Kontrollen, aber ich kann nicht damit arbeiten und ich weiß nicht, wie kann ich das für die Behandlung meiner Wunsch.Ich bin dankbar, wenn Sie mir bei der Verwendung von MouseCapture helfen können dieses Problem lösen oder eine andere Lösung geben.

Dank für Sie

+0

offensichtlich Fokus verloren und verlassen ist nicht meinen asnwer – hamed

+0

Ich denke, der Drop-down-Teil der ComboBox Steuerung ist eigentlich in einem separaten Fenster aus dem Textfeld. Sie könnten etwas Ähnliches versuchen: Zeigen Sie Ihr DataGridView in einem separaten, dedizierten Fenster und verstecken Sie dieses Fenster, wenn es deaktiviert ist. – adv12

+0

Vielleicht gibt es eine einfache Lösung, aber ich bin in WinForms ein wenig eingerostet, so dass im Moment nur etwas wie http://stackoverflow.com/questions/4991044/winforms-intercepting-mouse-event-on-main-form vorschlagen kann -first-not-on-controls –

Antwort

1

Eine individuelle Steuerung dies recht einfach machen sollte, vor allem, wenn es sich um eine Top-Level-Steuerung (das heißt direkt im Hauptfenster). Sie können auf Klickereignisse auf dem übergeordneten Objekt warten und mithilfe der ClientRectangle-Eigenschaft ermitteln, ob der Klick außerhalb der DataGridView war.

Hier ist ein einfaches Beispiel:

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

Sehr geehrte @ Peter ich Ihre Lösung testen, ich wieder mit meinem Problem konfrontiert. Ich sagte, ich habe mehrere Control auf meinem Formular, dann wie Sie sagten, ich ein benutzerdefiniertes Steuerelement erstellen und auf Formular setzen, aber weil wir Parent.MouseClick nur überwachen, wenn Sie auf das übergeordnete Formular klicken, erkennen wir Klick aus benutzerdefinierten Steuerelement und wenn Benutzer auf klicken Andere Steuerelemente für das benutzerdefinierte Steuerelement des übergeordneten Formulars erkennen diesen Klick nicht. – hamed

+0

Hallo @ Hamed, verstehe ich jetzt.Ich denke, diese neue Version sollte funktionieren – Peter

+0

Liebe @pete diese neue Lösung funktioniert einwandfrei. du bist großartig. – hamed