Manipulierbare Liste

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Manipulierbare Liste

    Hallo miteinander,

    Ich will aus daten eine liste erstellen lassen in welcher der Nutzer dann per ziehen mit der Maus die Positionen anpassen kann.
    Im besten Fall sind die einzelnen Zeilen noch an-/anwählbar.

    Gibt es dafür eine einfache Lösung?

    Checkboxlist hab ich schon versucht aber da bekomm ich das positionieren nicht hin.

    fiedel93felix schrieb:

    Ich will aus daten eine liste erstellen lassen
    Von welchem Datentyp reden wir?
    ====
    Element anklicken, rechte Maustaste => ContextMenu => Editieren
    => Dialog, das Element hineinreichen, editieren
    => OK => Element zurückschreiben
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat des Startposts an dieser Stelle entfernt ~VaporiZed
    @fiedel93felix:
    Ich korrigiere/präzisiere mal deinen Post:
    1. Du hast eine Liste von Daten
    2. Die willst du in einem geeigneten SteuerElement anzeigen
      1. dort sollen sie an/abwählbar sein
      2. dort sollen sie mittels Drag/Drop in ihrer Reihenfolge verschiebbar sein

    fiedel93felix schrieb:

    Gibt es dafür eine einfache Lösung?
    Nein.
    Insbesondere DragnDrop ist innerhalb desselben Listen-Controls ist nie einfach

    fiedel93felix schrieb:

    Checkboxlist...
    Jo, da musss man sich grundsätzlich entscheiden - es gibt 3 Controls, die Listen anzeigen können, mit abwählbaren Elementen:
    • CheckedListbox
      unterstützt Databinding nur so halbwegs, da muss man tricksen.
    • ListView
      unterstützt überhaupt kein Databinding, da muss man lausig mit ListViewItem und ListviewSubItem herumfuchteln, reintun, raustun, konvertieren - ich verwende ListView garnimmer
    • DataGridview
      unterstützt Databinding. Da kann man die Elemente in gewünschter Reihenfolge anordnen - das DGV stellt das dann von selbst richtig dar
    Jo, aber Drag&Drop wird deswegen trotzdem nicht einfach.
    Es gibt einfachere Forms, mit denen eine Reihenfolge eingestellt werden kann:
    Ein ListenControl, und da wählt man ein Element an. Daneben gibts einen kleinen Button für rauf, und einen für runter.
    Etwa wenn du die Reihenfolge der Tabs in einem TabControl bestimmen willst - da kannst du so einen Reihenfolge-Bestimmungs-Dialog angucken.
    Ist vielfach einfacher zu programmieren als eine D&D - Lösung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Sowas dachte ich als Billig-Lösung:

    DGV mit DataSet als Source

    VB.NET-Quellcode

    1. Private start, stopp As Integer
    2. Private data As Integer() = {1, 2, 3, 4, 5, 6, 18}
    3. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    4. For Each d In data
    5. DS1.data.AdddataRow(d)
    6. Next
    7. End Sub
    8. Private Sub dgv_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.CellMouseDown
    9. start = e.RowIndex
    10. End Sub
    11. Private Sub dgv_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.CellMouseUp
    12. stopp = e.RowIndex
    13. If start = stopp Then Exit Sub
    14. Dim hold As Integer = DS1.data(start).Ints
    15. If start < stopp Then
    16. For i = 0 To stopp - start - 1
    17. DS1.data(start + i).Ints = DS1.data(start + i + 1).Ints
    18. Next
    19. Else
    20. For i = 0 To start - stopp - 1
    21. DS1.data(start - i).Ints = DS1.data(start - i - 1).Ints
    22. Next
    23. End If
    24. DS1.data(stopp).Ints = hold
    25. End Sub


    Man sieht Drag and Drop ja relativ häufig, aber wie man es richtig macht weiß ich auch nicht.
    Vielen Dank für die Antworten.

    an ein DataGridView hab gar nicht gedacht.
    Aber es jetzt darüber gelöst.

    VB.NET-Quellcode

    1. Private Sub dgv_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
    2. start = e.RowIndex
    3. End Sub
    4. Private Sub dgv_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp
    5. Dim fehlerzeile As Double = 0
    6. Try
    7. stopp = e.RowIndex
    8. If start = stopp Then Exit Sub
    9. Dim Spalte1(DataGridView1.RowCount - 1) As Boolean
    10. Dim Spalte2(DataGridView1.RowCount - 1) As String
    11. Dim AnzahlZeilen As Integer = DataGridView1.RowCount
    12. fehlerzeile = 1
    13. If start < stopp Then
    14. fehlerzeile = 2
    15. For i = 0 To start - 1
    16. Spalte1(i) = DataGridView1.Rows.Item(i).Cells(0).Value
    17. Spalte2(i) = DataGridView1.Rows.Item(i).Cells(1).Value
    18. Next
    19. fehlerzeile = 2.1
    20. For i = start To stopp - 1
    21. Spalte1(i) = DataGridView1.Rows.Item(i + 1).Cells(0).Value
    22. Spalte2(i) = DataGridView1.Rows.Item(i + 1).Cells(1).Value
    23. Next
    24. fehlerzeile = 2.2
    25. Spalte1(stopp) = DataGridView1.Rows.Item(start).Cells(0).Value
    26. Spalte2(stopp) = DataGridView1.Rows.Item(start).Cells(1).Value
    27. fehlerzeile = 2.3
    28. If Not stopp = DataGridView1.RowCount Then
    29. For i = stopp + 1 To DataGridView1.RowCount - 1
    30. Spalte1(i) = DataGridView1.Rows.Item(i).Cells(0).Value
    31. Spalte2(i) = DataGridView1.Rows.Item(i).Cells(1).Value
    32. Next
    33. End If
    34. End If
    35. fehlerzeile = 3
    36. If start > stopp Then
    37. fehlerzeile = 4
    38. If Not stopp = 0 Then
    39. For i = 0 To stopp - 1
    40. Spalte1(i) = DataGridView1.Rows.Item(i).Cells(0).Value
    41. Spalte2(i) = DataGridView1.Rows.Item(i).Cells(1).Value
    42. Next
    43. End If
    44. fehlerzeile = 4.1
    45. Spalte1(stopp) = DataGridView1.Rows.Item(start).Cells(0).Value
    46. Spalte2(stopp) = DataGridView1.Rows.Item(start).Cells(1).Value
    47. fehlerzeile = 4.2
    48. For i = stopp + 1 To start
    49. Spalte1(i) = DataGridView1.Rows.Item(i - 1).Cells(0).Value
    50. Spalte2(i) = DataGridView1.Rows.Item(i - 1).Cells(1).Value
    51. Next
    52. fehlerzeile = 4.3
    53. For i = start + 1 To DataGridView1.RowCount - 1
    54. Spalte1(i) = DataGridView1.Rows.Item(i).Cells(0).Value
    55. Spalte2(i) = DataGridView1.Rows.Item(i).Cells(1).Value
    56. Next
    57. fehlerzeile = 4.4
    58. End If
    59. fehlerzeile = 5
    60. DataGridView1.Rows.Clear()
    61. For i = 0 To AnzahlZeilen - 1
    62. DataGridView1.Rows.Insert(i, Spalte1(i), Spalte2(i))
    63. Next
    64. Catch ex As Exception
    65. MsgBox("fehler " & fehlerzeile)
    66. End Try
    67. End Sub
    MsgBox? Ich glaube du hast noch den VisualBasic Namespace als Generalimport drin.
    Schau mal hier rein. Visual Studio – Empfohlene Einstellungen
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.