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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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.
Hallo hypersurf,
sorry, tut mir leid. Vielleicht hilft dir das ja weiter: http://www.codeproject.com/KB/tree/TreeViewDragDrop.aspx .
zero_x 😉
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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...
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.