Laden...

Drag & Drop: Listview nach Treeview und TreeNode dabei markieren

Erstellt von hypersurf vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.070 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren
Drag & Drop: Listview nach Treeview und TreeNode dabei markieren

Hallo zusammen,

ich habe in meiner Anwendung die Drag & Drop-Funktionalität von einem ListView in ein TreeView implementiert. D. h. ich kann ListViewItems auf ein TreeNode ziehe und dann wird automatisch unter dem TreeNode ein neuer Node generiert. Soweit so gut.

Um dem Anwender den Drag & Drop-Vorgang zu erleichtern, würde ich gerne den TreeNode über dem sich die Maus beim Drag & Drop-Vorgang gerade befindet markieren.

Das funktioniert leider nicht so einfach wie ich es mir vorgestellt habe, bzw. ich mache irgendwas falsch und finde den Fehler nicht:

      private void tvMain_DragOver(object sender, DragEventArgs e)
      {

         if (e.Data.GetData(typeof(ListViewItem)) != null)
         {
            Point p = new Point(e.X, e.Y);
            tvMain.PointToClient(p);
            TreeNode node = tvMain.GetNodeAt(p);

            if (node != null)
            {
               tvMain.SelectedNode = node;
            }
         }
      }


Auch wenn "node" nicht null ist funktioniert das setzen des SelectedNode's nicht: Der Node wird nicht blau markiert.

Hat jemand eine Idee, woran das liegen könnte?

Danke & Gruß

Markus

1.044 Beiträge seit 2008
vor 15 Jahren

Hallo hypersurf,

siehe: http://support.microsoft.com/kb/307968

zero_x

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren

Hallo zero_x,

in dem Beispiel von Microsoft funktioniert das ebenfalls nicht, bzw. wird auch überhaupt nicht versucht.

Ich möchte nur den TreeNode über dem sich die Maus während des Drag & Drop-Vorgangs befindet markieren.

1.044 Beiträge seit 2008
vor 15 Jahren

Hallo hypersurf,

sorry, tut mir leid. Vielleicht hilft dir das ja weiter: http://www.codeproject.com/KB/tree/TreeViewDragDrop.aspx .

zero_x 😉

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 15 Jahren

Hallo zero_x,

danke für Deine Hilfe, durch das letzte Beispiel bin ich letztendlich auf die richtige Lösung gekommen:


      private void tvMain_DragOver(object sender, DragEventArgs e)
      {

         if (e.Data.GetData(typeof(ListViewItem)) != null)
         {
            TreeNode node = tvMain.GetNodeAt(tvMain.PointToClient(new Point(e.X, e.Y)));
            if (node != null)
            {
               e.Effect = DragDropEffects.Move;
               tvMain.SelectedNode = node;
               tvMain.Focus(); //wichtig damit das markierte Element auch so angezeigt wird.
            }
         }
      }

Man muss den Focus auf das Treeview setzen, damit das SelectedNode auch wirklich als ausgewählt (blau markiert) angezeigt wird. Denn wenn ein anderes Steuerelement den Focus erhält, bleibt zwar das Objekt SelectedNode erhalten, die blaue Markierung aber nicht...

5.299 Beiträge seit 2008
vor 15 Jahren

Man muss den Focus auf das Treeview setzen, damit das SelectedNode auch wirklich als ausgewählt (blau markiert) angezeigt wird. Denn wenn ein anderes Steuerelement den Focus erhält, bleibt zwar das Objekt SelectedNode erhalten, die blaue Markierung aber nicht... Da gibts die Property HideSelection, dassis immer das erste, wassich mit einem Treeview, Listview, Richtextbox, textbox mache, dassich die erstmal auf false setze. IMO idiotischerweise ist die nämlich auf true voreingestellt.

Haste dirmal (nicht ganz) alles erschlagendes DragnDrop angeguckt?

Edit: sehe grade, daß du als Markierung des DropTargets den SelectedNode setzst.
Dassis recht unschön, weil da hängen sehr häufig auch Events dran.
Im gegebenen Link ist ein ItemHighlighter, der greift nicht in Einstellungen des Controls ein.

Der frühe Apfel fängt den Wurm.