none
Collapse in einer TreeView bei DoubleClick unterdrücken RRS feed

  • Frage

  • Hi Leute,

    wie die Überschirft schon sagt, möchte ich das Collapse / Zusammenklappen meiner Baumstruktur einer TreeView verhindern, wenn doppelt auf einen Knoten dieses Baum gedrückt wird. Allerdings soll Collapse funktionieren, wenn auf das kleine PlusMinus-Symbol geklickt wird! Somit kann ich das Collapse-Event nicht einfach immer unterdrücken... irgendwie muss ich abfragen können, wer das Collapse gestartet hat (DoubleClick oder PlusMinusClick), und dann in Abhängigkeit davon den Baum Zusammenklappen oder nicht, aber ich weiß nicht wie. Hat da jemand eine Idee?

    Derzeit verwende ich das BeforeCollapse-Ereignis und verbiete das Zusammenklappen immer:

    System::Void Form1::treeView1_BeforeCollapse(System::Object^ sender, System::Windows::Forms::TreeViewCancelEventArgs^ e) 
    	{
    	//Collapse immer unterbinden
    	e->Cancel = true;
    	}
    

    Donnerstag, 25. August 2011 13:33

Antworten

  • Ok.. da komm ich noch nicht ganz mit. Noch einmal für Semi-Wissende bitte:

    Ich halte mich nicht einmal für einen Halbwissenden bei Windows Foms Anwendungen. Ich habe einfach zu wenig damit zu tun.

    Wenn ich es richtig verstehe, bekomme ich Zugriff auf Elemente, die ich normalerweise nicht sehe, wenn ich ne eigene MeineTreeview-Klasse schreibe, die ich von der Treeview-Klasse ableite. In meinem Fall auf das Element "OnDoubleClick", welches ich nirgends sehe, wenn ich eine Treeview per Designer erstelle - weder in den Eigenschaften, noch in den Ereignissen. OnDoubleClick regelt anscheinend, was passiert wenn man Doppelt Clickt, sprich welche Ereignisse erzeugt werden. In meinem Fall werden bei der Standard-Treeview mind. die Ereignisse "BeforeCollapse" und "DoubleClick" ausgelöst... ich finde in der VS-Hilfe leider keine Übersicht, die mir zeigt welche Ereignisse standardmäßig mit OnDoubleClick ausgelöst werden. Hat da jemand nen Link für mich?

    Da ich auch weniger als Halbwissender bin so wie ich es verstehe:
    - OnDoubleClick ist die Methode die im Control ausgelöst wird, wenn der Benutzer Doppelt auf ein Item klickt (ähnlich wie die WM_LBUTTONDBLCLK Nachricht in der WinAPI).
    - Was diese Nachricht tut ist Implemntierungsspezifisch und hat Dich eigentlich nichts zu interessieren, denn das liegt dieses Verhalten bestimmt ja der Entwickler.
    - Intern wird vermutlich ein HitTest ausgeführt um zu entschieden was zu tun ist.
    - Die entsprechende Reaktion ist eben der Expand, oder auch nicht...
    - Irgendwann wird der Delegator aufgerufen für alle die an DoubleClick interssiert sind. (Ähnlich wie ein NM_DBLCLK Notification in der WinAPI).

    Lies doch einfach mal die Grundlagen zu Windows Form Controls. Da steht das drin. Ich habe mich für WIndows Forms nie interessieren müssen und weiß es nur aus eineigen Büchern von Jeffrey Richter und Charles Petzold

    Und Frage Nr.2 wäre: Wenn ich die Klasse ableite, kann ich das abgeleitete Element leider nicht per Designer verwenden, da müsste ich ja irgendwie die abgeleitete Klasse in die Toolbox bekommen... geht das irgendwie? Denn mein Treeview möchte ich schon noch weiter in der Entwurfsansicht sehen und gegebenenfalls verändern können.

    Und? Schon probiert?
    Ansonsten fragst Du auch hier einen "weniger als Halbwissenden" ;)
    Ansonsten gibt es genug Stoff im Netz wie man mit UserControls umgeht und das wäre es ja...

    Zudem Windows Form und C++/CLI halte ich für keine gute Kombination...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 30. August 2011 08:31
    Moderator

Alle Antworten

  • Hilft Dir e->Action nicht?
    http://msdn.microsoft.com/de-de/library/system.windows.forms.treeviewaction.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 25. August 2011 14:30
    Moderator
  • Hi Martin dank dir für die Antwort,

    e->Action kannte ich noch nicht, aber leider hilft es mir auch nicht weiter, weil es nur 5 mögliche Aktionen gibt: ByKeyboard, ByMouse, Collapse, Expand, Unknown. Da ich aber beide male auf Mausereignisse reagiere (Doppelklick auf Treevieweintrag und Klick auf PlusMinus) kann ich diese beiden damit nicht auseinanderhalten.

    Andere Ideen? Kann man per Code nicht irgendwie detailierter die Ereignis auslösende Ursache feststellen?

    Freitag, 26. August 2011 06:30
  • Und Du hast das getestet?

    Wenn es kein C++/CLI wäre würde mir einiges einfallen.

    Dann überschreibe doch den Doppelklick und gib das Event nicht weiter... dann sollte auch das "unerwünschte Standardverhalten" ausgehebelt werden.

     


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 26. August 2011 06:51
    Moderator
  • Getestet hab ichs, geht leider nicht. Tja... wie überschreibt man denn einen Doppelclick?

    Ich möchte ja auch den Doppelclick nicht komplett hemmen, der soll ja weiter funktionieren. Bei einem Doppelclick möchte ich den Text des Treeviewknotens edititeren können. Mir ist auch aufgefallen dass dieses Collapse Ereignis bei einem Doppelclick eher aufgerufen wird, als mein Doppelclick Event Handler. Somit könnte ich, selbst wenn ich das Doppelklick Ereignis stoppe, nix mehr an dem Collapse ändern, da der schon ausgeführt wurde.

    Echt verzwickt

    Freitag, 26. August 2011 08:18
  • Du leitest eine eigene Klasse von TreeView ab.
    OnDoubleClick wird aufgerufen und wnen Du die Basis Implementierung aufrufst werden die Delegates für DoubleClick aufgerufen.

    Du kannst ja im OnDoubleClick selbst entscheiden was zu tun ist...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 26. August 2011 10:37
    Moderator
  • Ok.. da komm ich noch nicht ganz mit. Noch einmal für Semi-Wissende bitte:

    Wenn ich es richtig verstehe, bekomme ich Zugriff auf Elemente, die ich normalerweise nicht sehe, wenn ich ne eigene MeineTreeview-Klasse schreibe, die ich von der Treeview-Klasse ableite. In meinem Fall auf das Element "OnDoubleClick", welches ich nirgends sehe, wenn ich eine Treeview per Designer erstelle - weder in den Eigenschaften, noch in den Ereignissen. OnDoubleClick regelt anscheinend, was passiert wenn man Doppelt Clickt, sprich welche Ereignisse erzeugt werden. In meinem Fall werden bei der Standard-Treeview mind. die Ereignisse "BeforeCollapse" und "DoubleClick" ausgelöst... ich finde in der VS-Hilfe leider keine Übersicht, die mir zeigt welche Ereignisse standardmäßig mit OnDoubleClick ausgelöst werden. Hat da jemand nen Link für mich?

    Und Frage Nr.2 wäre: Wenn ich die Klasse ableite, kann ich das abgeleitete Element leider nicht per Designer verwenden, da müsste ich ja irgendwie die abgeleitete Klasse in die Toolbox bekommen... geht das irgendwie? Denn mein Treeview möchte ich schon noch weiter in der Entwurfsansicht sehen und gegebenenfalls verändern können.

    Dienstag, 30. August 2011 07:54
  • Ok.. da komm ich noch nicht ganz mit. Noch einmal für Semi-Wissende bitte:

    Ich halte mich nicht einmal für einen Halbwissenden bei Windows Foms Anwendungen. Ich habe einfach zu wenig damit zu tun.

    Wenn ich es richtig verstehe, bekomme ich Zugriff auf Elemente, die ich normalerweise nicht sehe, wenn ich ne eigene MeineTreeview-Klasse schreibe, die ich von der Treeview-Klasse ableite. In meinem Fall auf das Element "OnDoubleClick", welches ich nirgends sehe, wenn ich eine Treeview per Designer erstelle - weder in den Eigenschaften, noch in den Ereignissen. OnDoubleClick regelt anscheinend, was passiert wenn man Doppelt Clickt, sprich welche Ereignisse erzeugt werden. In meinem Fall werden bei der Standard-Treeview mind. die Ereignisse "BeforeCollapse" und "DoubleClick" ausgelöst... ich finde in der VS-Hilfe leider keine Übersicht, die mir zeigt welche Ereignisse standardmäßig mit OnDoubleClick ausgelöst werden. Hat da jemand nen Link für mich?

    Da ich auch weniger als Halbwissender bin so wie ich es verstehe:
    - OnDoubleClick ist die Methode die im Control ausgelöst wird, wenn der Benutzer Doppelt auf ein Item klickt (ähnlich wie die WM_LBUTTONDBLCLK Nachricht in der WinAPI).
    - Was diese Nachricht tut ist Implemntierungsspezifisch und hat Dich eigentlich nichts zu interessieren, denn das liegt dieses Verhalten bestimmt ja der Entwickler.
    - Intern wird vermutlich ein HitTest ausgeführt um zu entschieden was zu tun ist.
    - Die entsprechende Reaktion ist eben der Expand, oder auch nicht...
    - Irgendwann wird der Delegator aufgerufen für alle die an DoubleClick interssiert sind. (Ähnlich wie ein NM_DBLCLK Notification in der WinAPI).

    Lies doch einfach mal die Grundlagen zu Windows Form Controls. Da steht das drin. Ich habe mich für WIndows Forms nie interessieren müssen und weiß es nur aus eineigen Büchern von Jeffrey Richter und Charles Petzold

    Und Frage Nr.2 wäre: Wenn ich die Klasse ableite, kann ich das abgeleitete Element leider nicht per Designer verwenden, da müsste ich ja irgendwie die abgeleitete Klasse in die Toolbox bekommen... geht das irgendwie? Denn mein Treeview möchte ich schon noch weiter in der Entwurfsansicht sehen und gegebenenfalls verändern können.

    Und? Schon probiert?
    Ansonsten fragst Du auch hier einen "weniger als Halbwissenden" ;)
    Ansonsten gibt es genug Stoff im Netz wie man mit UserControls umgeht und das wäre es ja...

    Zudem Windows Form und C++/CLI halte ich für keine gute Kombination...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 30. August 2011 08:31
    Moderator