Laden...

UserSortableListBox - ListBox, deren Items mit der Maus umsortiert werden können

Erstellt von DFDotNet vor 13 Jahren Letzter Beitrag vor 12 Jahren 5.118 Views
D
DFDotNet Themenstarter:in
201 Beiträge seit 2007
vor 13 Jahren
UserSortableListBox - ListBox, deren Items mit der Maus umsortiert werden können

Beschreibung:

Eine Erweiterung der System.Windows.Forms.ListBox in der die Items per Maus (Drag&Drop) umsortiert werden können.
Dazu wird eine Linie an der Stelle angezeigt, an der die "gedraggten" Items eingefügt werden.
Ich brauchte so etwas an mehreren Stellen und habe mir daher das Control selber implementiert.

Mögliche Erweiterungen, die noch nicht implementiert sind:

  • Draggen und Verschieben mehrerer Items (aktuell nicht möglich, da durch Klick auf ein Item die mehrfach-Selektion aufgehoben wird)
  • Verschieben der Items mit den Pfeiltasten (hoch/runter)

Schlagwörter: ListBox, UserControl, Control

T
2 Beiträge seit 2011
vor 12 Jahren

Moin,

habe das Control gerade mal ausprobiert. Beim Drop wird allerdings eine InvalidOperationException ausgelöst. In der foreach-Schleife in der Methode OnDragDrop(). Wenn man die Ausführung fortsetzt klappt der Drag & Drop Vorgang allerdings.

Codezeile 63 in UserSortableListBox.cs


foreach (object item in droppedData)
      {
        if (Items.IndexOf(item) < insertIndex)
          insertIndex--;

        Items.Remove(item);
        Items.Insert(insertIndex, item);
        insertIndex++;
      }

Fehlermeldung:
System.InvalidOperationException wurde nicht von Benutzercode behandelt.
Message=Die Liste, an die der Enumerator gebunden ist, wurde geändert. Ein Enumerator kann nur verwendet werden, wenn die Liste nicht geändert wird.
Source=System.Windows.Forms
StackTrace:
bei System.Windows.Forms.ListBox.ItemArray.EntryEnumerator.System.Collections.IEnumerator.MoveNext()
bei UserSortableListBox.UserSortableListBox.OnDragDrop(DragEventArgs drgevent) in C:\Dokumente und Einstellungen\Operator\Eigene Dateien\Visual Studio 2010\Code Snippets\Visual C#\UserSortableListBoxTest\UserSortableListBox\UserSortableListBox.cs:Zeile 73.
bei System.Windows.Forms.Control.System.Windows.Forms.IDropTarget.OnDragDrop(DragEventArgs drgEvent)
bei System.Windows.Forms.DropTarget.System.Windows.Forms.UnsafeNativeMethods.IOleDropTarget.OleDrop(Object pDataObj, Int32 grfKeyState, Int64 pt, Int32& pdwEffect)
InnerException:

Gruß
Cube

T
2 Beiträge seit 2011
vor 12 Jahren

Habe die foreach-Schleife durch eine for-Schleife ersetzt


for (int index = 0; index < droppedData.Count; index++)
      {
          object item = droppedData[index];

          if (Items.IndexOf(item) < insertIndex)
              insertIndex--;

          Items.Remove(item);
          Items.Insert(insertIndex, item);
          insertIndex++;
      }