2 Pluspunkte 0 Minuspunkte
Ist es möglich eine Liste (ListView, TreeView) in C# anzuzeigen und die Elemente mit Drag und Drop zu sortieren? Also nicht das man oben auf den Spalten Header klickt sondern das man jedes Element einzeln ordnen kann.
von  

2 Antworten

1 Pluspunkt 0 Minuspunkte

Setze die Eigenschaften "View" des ListView auf "Details" und "AllowDrop" auf true.

Erstelle Event-Handler für die Drag & Drop Ereignisse "ItemDrag", "DragEnter" und "DragDrop".

Hier ist ein einfaches Beispiel für die Handler.

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
    listView1.DoDragDrop(e.Item, DragDropEffects.Move);
}

private void listView1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void listView1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(ListViewItem)))
    {
        ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
        Point clientPoint = listView1.PointToClient(new Point(e.X, e.Y));
        ListViewItem targetItem = listView1.GetItemAt(clientPoint.X, clientPoint.Y);

        if (targetItem != null)
        {
            int targetIndex = targetItem.Index;

            // Remove the dragged item from its current position
            listView1.Items.Remove(draggedItem);
            // Insert the dragged item at the new position
            listView1.Items.Insert(targetIndex, draggedItem);
        }
    }
}
von (776 Punkte)  
1 Pluspunkt 0 Minuspunkte

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;
        }
    }
}
von (732 Punkte)