Hier hast du ein vereinfachtes Beispiel. Du kannst es bestimmt an deine Zwecke anpassen.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WinFormsApp1
{
public partial class Form1 : Form
{
private ListViewItem draggedItem; // Zwischenspeicher für das gezogene Element
public Form1()
{
InitializeComponent();
// Initialisiert die ListView
InitializeListView();
}
private void InitializeListView()
{
// Legt die Details-Ansicht für die ListView fest
listView1.View = View.Details;
// Aktiviert die Möglichkeit von Drag & Drop
listView1.AllowDrop = true;
// Fügt Spalten zur ListView hinzu
listView1.Columns.Add("Name", 100);
listView1.Columns.Add("Age", 50);
// Fügt einige Beispiel-Elemente zur ListView hinzu
ListViewItem item1 = new ListViewItem(new[] { "John", "25" });
ListViewItem item2 = new ListViewItem(new[] { "Jane", "30" });
ListViewItem item3 = new ListViewItem(new[] { "Bob", "22" });
listView1.Items.AddRange(new[] { item1, item2, item3 });
// Weist den Event-Handler für das MouseDown-Event zu
listView1.MouseDown += listView1_MouseDown;
// Weist den Event-Handler für das DragEnter-Event zu
listView1.DragEnter += listView1_DragEnter;
// Weist den Event-Handler für das DragDrop-Event zu
listView1.DragDrop += listView1_DragDrop;
}
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
// Startet den Drag & Drop-Vorgang, wenn die linke Maustaste gedrückt wird
if (e.Button == MouseButtons.Left)
{
// Überprüft, ob ein Element ausgewählt ist
ListViewItem selectedItem = listView1.GetItemAt(e.X, e.Y);
if (selectedItem != null)
{
// Speichert das gezogene Element zwischen
draggedItem = selectedItem;
// Startet den Drag & Drop-Vorgang mit dem gezogenen Element
listView1.DoDragDrop(draggedItem, DragDropEffects.Move);
}
}
}
private void listView1_DragEnter(object sender, DragEventArgs e)
{
// Legt den Effekt für den Drag & Drop-Vorgang fest
e.Effect = DragDropEffects.Move;
}
private void listView1_DragDrop(object sender, DragEventArgs e)
{
// Überprüft, ob das gezogene Datenformat ListViewItem-Objekte enthält
if (e.Data.GetDataPresent(typeof(ListViewItem)))
{
// Holt das gezogene ListViewItem
//ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
// Bestimmt die Position, an der das Element abgelegt wurde
Point clientPoint = listView1.PointToClient(new Point(e.X, e.Y));
ListViewItem targetItem = listView1.GetItemAt(clientPoint.X, clientPoint.Y);
// Überprüft, ob ein gültiges Zielitem gefunden wurde
if (targetItem != null)
{
// Bestimmt den Index des Zielitems
int targetIndex = targetItem.Index;
// Entfernt das gezogene Item von seiner aktuellen Position
listView1.Items.Remove(draggedItem);
// Fügt das gezogene Item an der neuen Position ein
listView1.Items.Insert(targetIndex, draggedItem);
}
}
foreach (ListViewItem item in listView1.SelectedItems)
{
item.Selected = false;
}
// Setzt das gezogene Element zurück
draggedItem = null;
}
}
}