Listbox Rückgängig machen...

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    Listbox Rückgängig machen...

    Moin! :)
    Ich habe eine Listbox1 und zwei Buttons auf einer WinForm.
    Nun möchte ich, dass man wenn man ein Wert aus der ListBox1 entfernt, eine Rückgängig Funktion einbauen.
    Leider, komme ich hier nicht mehr weiter.
    Kann mir jemand einen Denkanstoß geben, damit ich das Problem lösen kann?
    BIG THX

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim arrlistItems As New ArrayList()
    4. Dim index As Long = 0
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. ' btnLöschen
    7. index += 1
    8. arrlistItems.Add(Me.ListBox1.SelectedItem)
    9. Me.ListBox1.Items.Remove(Me.ListBox1.SelectedItem)
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. ' btnRückgänig
    13. index -= 1
    14. Me.ListBox1.Items.Add(arrlistItems(CInt(index)))
    15. End Sub
    16. End Class
    Visual Basic.NET 8o
    MS-SQL
    8o
    Hallo

    Ich würde esmit einer Klasse machen. Du willst ja sicher das die Items auch wieder an dieser Position eingefügt werden oder?
    Habe das mal mit zwei Buttons und mit einer Listbox probiert. funzt soweit.

    Hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private undoList As New List(Of ListUndo)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. For i As Integer = 0 To 10
    5. Me.ListBox1.Items.Add("Test " & i)
    6. Next
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. 'Delete
    10. If Me.ListBox1.SelectedItem IsNot Nothing Then
    11. Me.undoList.Add(New ListUndo(Me.ListBox1.SelectedItem, Me.ListBox1.SelectedIndex))
    12. Me.ListBox1.Items.Remove(Me.ListBox1.SelectedItem)
    13. End If
    14. Me.Button1.Enabled = Me.ListBox1.Items.Count > 0
    15. End Sub
    16. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    17. 'Undo
    18. Me.ListBox1.Items.Insert(undoList.Last.Index, undoList.Last.Item)
    19. Me.undoList.Remove(undoList.Last)
    20. Me.Button2.Enabled = Me.undoList.Count > 0
    21. End Sub
    22. End Class
    23. Public Class ListUndo
    24. Public Sub New(item As Object, index As Integer)
    25. Me.Item = item
    26. Me.Index = index
    27. End Sub
    28. Public Property Item As Object
    29. Public Property Index As Integer
    30. End Class


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Cheffboss Dann kannste auch gleich noch Deine Items in ein List(Of T) packen und diese der ListBox als DataSource zuweisen.
    Mit der kannst Du genau so umgehen, wie es @Nofear23m geschrieben hat, außerdem hast Du Daten und GUI getrennt.
    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!
    Oder du löst das Ganze mit der Stack-Klasse

    VB.NET-Quellcode

    1. Dim undoList As New Stack(Of Object())
    2. Private Sub Undo_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If undoList.Count > 0 Then
    4. ListBox1.Items.Clear()
    5. ListBox1.Items.AddRange(undoList.Pop())
    6. End If
    7. End Sub
    8. Private Sub Remove_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    9. undoList.Push(ListBox1.Items.Cast(Of Object).ToArray)
    10. ListBox1.Items.Remove(ListBox1.SelectedItem)
    11. End Sub
    @Nofear23m
    Vielen Dank, für diesen Code. :)
    Aber leider funktioniert dieser bei mir nicht.



    @RodFromGermany
    Vielen Dank, ich werde mich morgen darüber informieren. ;)

    @HenryV
    Vielen Dank ,der Code sieht top aus, und ist sehr übersichtlich. :)
    Aber leider funktioniert dieser bei mir auch nicht.



    @ErfinderDesRades
    Was eine ReDo Funktion sein soll, weiß ich nicht. ?(

    @an alle
    Vielen Dank, für eure Unterstützung,
    ich hoffe wir bekommen das Problem gelöst! :thumbup:
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss da sehe ich gerade das du unter .NET 2.0 arbeitest. Sorry, habe ich übersehen. Aber warum macht man sowas?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Cheffboss schrieb:

    Was eine ReDo Funktion sein soll, weiß ich nicht.
    Gugst Du Studio:
    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!
    @Nofear23m
    Ich möchte die Windows 98/Me/2000/XP Anwender nicht verlieren. :!:
    Falls mein Vorhaben nicht mit dem .NET 2.00 Framework möglich sein sollte,
    bin ich dann gezwungen eine neuere Framework Version zu verwenden.
    Mit welcher .NET Framework Version wäre der Code noch ausführbar?
    Gut wäre es, wenn das .NET Framework mit dem Code noch auf Windows XP läuft.
    Damit ich so wenig Anwender wie möglich verliere!

    @RodFromGermany
    So eine Funktion wäre sinvoll!
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cheffboss“ ()

    @Cheffboss Wenn Du @MemberName nicht Bold machst, werden die angesprochenen informiert. ;)
    Da musst Du zwei Listen führen und die abgearbeitete von UnDo nach ReDo packen.
    ReDo wird dann wie Do behandelt.
    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!

    RodFromGermany schrieb:

    @Cheffboss Da musst Du zwei Listen führen


    Vielen Dank! :)
    Hört sich sehr simpel an, werde ich dann morgen mal versuchen!
    Denn ich möchte, wenn möglichst auf .NET 2.0 bleiben.
    Visual Basic.NET 8o
    MS-SQL
    8o

    Cheffboss schrieb:

    auf .NET 2.0 bleiben.
    Da sollte es keine Probleme geben, nur List(Of T), weiter ist da nix.
    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!
    Hallo

    Cheffboss schrieb:

    Falls mein Vorhaben nicht mit dem .NET 2.00 Framework möglich sein sollte

    Doch, ist es auch, nur etwas anders, müsste ich mal versuchen. Oder du.

    Cheffboss schrieb:

    wenn das .NET Framework mit dem Code noch auf Windows XP läuft

    Also unter Windows XP ist denke ich mal wenig sinnvoll, ich kenne nicht mal wen der Windows XP hat. Ist ja auch ein enormes Sicherheitsrisiko da von MS nicht mehr Supporte, jetzt endet dann bald der Win 7 Support.
    ​Windows XP geht bis .Net 4.0 ! Da geht dann schon einiges.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    RodFromGermany schrieb:

    Da musst Du zwei Listen führen und die abgearbeitete von UnDo nach ReDo packen.
    Die Logik von Do / Undo / Redo ist bisserl anders.
    Es geht weniger um 2 Listen als um eine, mit besonderen Eigenschaften - eine History-List.
    Das ist eine (gerne verkettete) LIste mit einer CurrentPosition, die vor- und zurück kann.
    1. Bei Do verwirft man alles hinter der CurrentPosition und hängt ein neues Element an, und setzt auch die Currentposition drauf.
    2. Bei UnDo gehts rückwärts, aber ohne Elemente zu entfernen.
    3. Ist man rückwärts gegangen, kann man auch wieder vorwärts gehen: ReDo. (Ausser man beschreitet mittels Do ganz abweichende Wege (s.1.))

    Vor langem hab ich mich mal damit beschäftigt, und eine sehr anspruchsvolle Umsetzung verzapft:
    mycsharp.de/wbb2/thread.php?threadid=64852
    Ist vmtl. zu abgehoben, aber zumindest Stichwort "History-List" täte ich schon einbringen wollen.
    @Cheffboss
    Sorry, ich hab das .NET 2.0 auch übersehen.
    Hier der "downgegradete" Code

    VB.NET-Quellcode

    1. Dim undoList As New Stack(Of Object())
    2. Private Sub Undo_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If undoList.Count > 0 Then
    4. ListBox1.Items.Clear()
    5. ListBox1.Items.AddRange(undoList.Pop())
    6. End If
    7. End Sub
    8. Private Sub Remove_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    9. Dim lbObjArr(ListBox1.Items.Count - 1) As Object
    10. ListBox1.Items.CopyTo(lbObjArr, 0)
    11. undoList.Push(lbObjArr)
    12. ListBox1.Items.Remove(ListBox1.SelectedItem)
    13. End Sub