ausgewähltes Element einer ArrayList löschen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Kosmos_Igel.

    ausgewähltes Element einer ArrayList löschen

    Hallo zusammen,

    ich versuche gerade eine ArrayList in eine kleine Kundenverwaltungssoftware einzubauen. Die Suche eines Elements und das Hinzufügen neuer Elemente klappt bereits einwandfrei. Leider habe ich beim Löschen eines ausgewählten Elements Probleme. Ich möchte, dass der Bediener eine Kundennummer (eindeutige Identifizierung des Kunden) in eine Textbox eingibt und diesen Kunden mit dem Button "Löschen" aus der ArrayList entfernt. Der Kunde besteht aktuell aus den beiden Variablen Kundennummer und Nachname. Zudem wird der Kunde mit dem Konstruktor (OOP) erzeugt.

    Hier meine bisherigen Versuche im Quellcode:

    Quellcode

    1. Private Sub btnLöschen_Click(sender As System.Object, e As System.EventArgs) Handles btnLöschen.Click
    2. If tbxKundenNr.Text = "" Then
    3. MsgBox("Bitte geben Sie eine KundenNr. ein.")
    4. Else
    5. 'Do Until Kunde.pKundenNr = tbxKundenNr.Text
    6. ' If Kunde.pKundenNr = tbxKundenNr.Text Then
    7. ' kundenListe.Remove(Kunde)
    8. ' Else
    9. ' MsgBox("Bitte geben Sie eine passende KundenNr. ein.")
    10. ' End If
    11. 'Loop
    12. For Each Me.Kunde In kundenListe
    13. If Kunde.pKundenNr = tbxKundenNr.Text Then
    14. kundenListe.Remove(Me.Kunde)
    15. Else
    16. MsgBox("Bitte geben Sie eine passende KundenNr. ein.")
    17. End If
    18. Next Kunde
    19. End If
    20. tbxKundenNr.Clear()
    21. End Sub



    Weder mit der Do Until, noch mit der For Each Schleife komme ich bisher ans gewünschte Ziel.

    Ich hoffe, dass einer mir meinen Fehler findet und mir helfen kann.

    Vorab bereits besten Dank!!! ;)

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

    Da das kein VB6-Code, sondern VB.Net-Code ist, gleich erstmal ne Einstiegsfrage: Hast Du wirklich ne ArrayList? Die wär sowas von VB asbachurlat.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Erstmal sorry für die falsche Einstufung. Ich dachte Visual Basic in Visual Studio 2010 wäre VB6. Wie du vielleicht merkst, bin ich kein VB-Experte. Ich bereite als angehende Lehrkraft eine Unterrichtsstunde in VB vor. Thema ist die ArrayList oder eine ähnlich Form einer Liste. Welche Form wäre aus deiner Sicht denn besser passend?

    Hier mein Quellcode für die ArrayList:

    Quellcode

    1. Public Class Form1
    2. 'Private Kunde1, Titel As Kunde
    3. Dim kundenListe As New ArrayList
    4. Dim Kunde, Titel As Kunde
    5. Public Sub kundeAnlegen(ByVal kundenNr As Integer, nachname As String)
    6. Kunde = New Kunde(kundenNr, nachname)
    7. kundenListe.Add(Kunde)
    8. End Sub


    Hast du denn eine Idee, warum das Löschen eines ausgewählten Kunden nicht funktioniert?
    uih - dassis ganz schlecht.
    Du kannst dich nicht als Lehrer vorne hinstellen, und beibringen, von was du selbst nix verstehst.

    Das mag in Englisch, Mathe, Geografie, Sport hingehen, aber beim Programmieren nicht.

    Beim Programmieren geht jedes Gelernte sofort ins feste, unhinterfragte "Verhaltens-Schema" über, also wenn du deinen Kids ArrayList-Müll beibringst, so werden sie noch in 10 Jahren damit hantieren, und also nur Grütze programmieren.
    Besser ist, sie hättens nie gelernt, denn neu und richtig lernen ist viel einfacher als umlernen und einsehen, dass man 10 jahre lang Grütze programmiert hat.

    Hier wie dein Code richtig aussehen muss:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _Kunden As New List(Of Kunde)
    3. Private Sub btnLöschen_Click(sender As System.Object, e As System.EventArgs) Handles btnLöschen.Click
    4. If tbxKundenNr.Text = "" Then
    5. MessageBox.Show("Bitte geben Sie eine KundenNr. ein.")
    6. Else
    7. For Each kunde In _Kunden
    8. If kunde.pKundenNr = tbxKundenNr.Text Then
    9. kundenListe.Remove(kunde)
    10. tbxKundenNr.Clear()
    11. Return
    12. End If
    13. Next kunde
    14. MessageBox.Show("Bitte geben Sie eine passende KundenNr. ein.")
    15. End If
    16. End Sub
    17. Private Sub kundeAnlegen(ByVal kundenNr As Integer, nachname As String)
    18. Dim kunde = New Kunde(kundenNr, nachname)
    19. _Kunden.Add(kunde)
    20. End Sub
    21. End Class

    Hinweise:
    • Auf Klassen-Ebenen nimmt man Private statt Dim
    • Nur wenn nötig auf Klassen-Ebene deklarieren - wo lokal deklariert werden kann, soll man das auch tun.
    • Subs in einem Form müssen Private - es gibt bei Forms (ausser bei Dialogen) keine INstanz ausserhalb, die so eine Methode aufrufen könnte/dürfte
    • ByVal ist ein entbehrliches Schlüsselwort - standardmässig sind alle Parameter ByVal.
    • Ein grober schnitzer ist Zeile #10 - da wird eine Nummer mit einem Text verglichen - sowas darfst du den Kids wirklich nicht antun!
      Die reproduzieren das tausendfach, und tauchen dann hier im Forum auf, wenn nicht mehr weiter-wissen.
      Und müssen sich erstmal zurechtstutzen lassen, und klarwerden, dass sie das wichtigste am programmieren erst noch neu lernen müssen - nämlich das unterscheiden von Datentypen.
    • Ach - und Umlaute ('ö') in Code-Namen - es funktioniert meist, aber iwann arbeitet man mit Tools, die solch nicht unterstützen und Sch... wars. Besser von vornherein abgewöhnen.
    Jo - hofflich konnte ich dich motivieren, entweder die Aufgabe abzugeben, oder selbst erstmal proggen zu lernen.
    Im letzteren Falle erster Schritt wäre: Visual Studio - Empfohlene Einstellungen
    Das und die dort weiterführenden Links führen dazu, dass man Datentypen unterscheidet, und sich von VB6-Grütze-Code fernhalten kann.

    Jo, gäbe noch endlos zu räsonnieren - etwa hier ein ganzer Lehrplan: Datenverarbeitungs-Vorraussetzungen

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

    Kosmos_Igel schrieb:

    Ich dachte Visual Basic in Visual Studio 2010 wäre VB6.
    Ändere bitte den Titel dieses Deines Threads auf VB.NET und VS 2010.
    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: Den Titel habe ich jetzt auf VB.NET geändert. Eine Auswahl VS2010 konnte ich nicht vornehmen. Lediglich zwischen NET 2.0 oder NET 3.0 wählen.

    @ErfinderDesRades Besten Dank für deine Anmerkungen. Ich habe deine Hinweise jetzt mal eingebaut und den Quellcode mit der List(of Kunde) als Collection codiert. Die List(of T)-Klasse werde ich nun auf in die Unterrichtsstunde einbauen. Letzlich muss ich mich als Lehrkraft immer am vorgegebenen Lehrplan orientieren, auch wenn diese relativ zeitnah überholt sein können.

    Hier mein aktueller Quellcode, in dem alle gewünschten Funktionen einwandfrei funktionieren:

    Quellcode

    1. Public Class Form1
    2. Private Kundenliste As New List(Of Kunde)
    3. Private Titel As Kunde
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. Titel = New Kunde()
    6. rtbAusgabe.Text = Titel.Titel & vbCrLf
    7. kundeAnlegen(12345, "Schneider")
    8. kundeAnlegen(12346, "Müller")
    9. End Sub
    10. Private Sub kundeAnlegen(ByVal kundenNr As Integer, nachname As String)
    11. Dim kunde = New Kunde(kundenNr, nachname)
    12. Kundenliste.Add(kunde)
    13. End Sub
    14. Private Sub btnAnzeigen_Click(sender As System.Object, e As System.EventArgs) Handles btnAnzeigen.Click
    15. rtbAusgabe.Text = Titel.Titel & vbCrLf
    16. For Each kunde In Kundenliste
    17. rtbAusgabe.Text &= kunde.Ausgabe & vbCrLf
    18. Next kunde
    19. End Sub
    20. Private Sub btnAnlegen_Click(sender As System.Object, e As System.EventArgs) Handles btnAnlegen.Click
    21. Dim kundenNr As Integer = Integer.Parse(tbxKundenNr.Text)
    22. Dim nachname As String = tbxNachname.Text
    23. kundeAnlegen(kundenNr, nachname)
    24. tbxKundenNr.Clear()
    25. tbxNachname.Clear()
    26. End Sub
    27. Private Sub btnSuchen_Click(sender As System.Object, e As System.EventArgs) Handles btnSuchen.Click
    28. rtbAusgabe.Text = Titel.Titel & vbCrLf
    29. If tbxKundenNr.Text = "" And tbxNachname.Text = "" Then
    30. MsgBox("Bitte geben Sie eine KundenNr. oder einen Nachnamen ein.")
    31. End If
    32. If Not tbxKundenNr.Text = "" Then
    33. For Each kunde In Kundenliste
    34. If kunde.pKundenNr = Integer.Parse(tbxKundenNr.Text) Then
    35. rtbAusgabe.Text &= kunde.Ausgabe & vbCrLf
    36. End If
    37. Next kunde
    38. End If
    39. If Not tbxNachname.Text = "" Then
    40. For Each kunde In Kundenliste
    41. If kunde.pNachname = tbxNachname.Text Then
    42. rtbAusgabe.Text &= kunde.Ausgabe & vbCrLf
    43. End If
    44. Next kunde
    45. End If
    46. tbxKundenNr.Clear()
    47. tbxNachname.Clear()
    48. End Sub
    49. Private Sub btnLöschen_Click(sender As System.Object, e As System.EventArgs) Handles btnLöschen.Click
    50. If tbxKundenNr.Text = "" And tbxNachname.Text = "" Then
    51. MessageBox.Show("Bitte geben Sie eine KundenNr. oder einen Nachnamen ein.")
    52. End If
    53. If Not tbxKundenNr.Text = "" Then
    54. For Each kunde In Kundenliste
    55. If kunde.pKundenNr = Integer.Parse(tbxKundenNr.Text) Then
    56. Kundenliste.Remove(kunde)
    57. Return
    58. End If
    59. Next kunde
    60. MessageBox.Show("Bitte geben Sie eine passende KundenNr. ein.")
    61. End If
    62. If Not tbxNachname.Text = "" Then
    63. For Each kunde In Kundenliste
    64. If kunde.pNachname = tbxNachname.Text Then
    65. Kundenliste.Remove(kunde)
    66. Return
    67. End If
    68. Next kunde
    69. MessageBox.Show("Bitte geben Sie einen passenden Nachnamen ein.")
    70. End If
    71. tbxNachname.Clear()
    72. tbxKundenNr.Clear()
    73. End Sub
    74. End Class


    Gibt es eigentlich auch eine Möglichkeit eine bestimmtes Objekt zu überschreiben? Z.B. Die Kundin Müller mit der Kundennummer 12345 hat geheiratet und heißt nun Schneider. Mit welcher Methode der List(of T) lässt sich eine solche Änderung durchführen? Oder geht es nur über löschen und neu erfassen?

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

    Kosmos_Igel schrieb:

    Eine Auswahl VS2010 konnte ich nicht vornehmen.
    Jou, das Framework war es.
    Vielleicht machst Du Dir eine Routine, die einen Text als neue Zeile an die RichTextBox hängt, das liest sich im Code besser.
    Für welche Klassenstufe gibst Du Unterricht?
    Und:
    Wenn Du ein Forumsmitglied explizit ansprechen willst:
    @NAME Leerzeichen
    bzw.
    @'Name1 Name2' Leerzeichen,
    da wird das Mitglied benachrichtigt, dass Du ihn angesprochen hast.
    Nachgestellte Satzzeichen und führende Leerzeichen verhindern dies.
    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!
    Wie meinst du das mit einer Routine? Ich habe in einigen Codierungen gesehen, dass der Programmierer zu Beginn eine Variable wie "neueZeile" deklariert, die dann die Funktion von vbCrLf übernimmt. Also ungefähr so:

    Quellcode

    1. Private neueZeile As String = vbCrLf


    Ich werde in Zukunft in der Berufsschule bzw. in der Oberstufe unterrichten. Die Klassen haben dort das Fach Wirtschaftsinformatik, welches OOP in Visual Basic beinhaltet.

    Kannst du mir einen Input geben, wie ich die Kundenliste anhand der pKundenNr sortieren lassen kann? Oder wie ein bestehender Eintrag geändert/angepasst werden kann?

    Mit Sort() oder Sort(Comparer()) bin ich bisher nicht weitergekommen... :( Anscheinend reichen meine Kenntnisse noch nicht aus.

    Kosmos_Igel schrieb:

    Ich werde in Zukunft in der Berufsschule bzw. in der Oberstufe unterrichten.
    Dann ganz wichtig, weil die werden ja wirklich auf die Welt losgelassen: Visual Studio - Empfohlene Einstellungen
    Ich sehe an deim Code, du hast es noch nicht gemacht.
    Jeder, der Strict Off proggt, und den Vb6-Namespace-GeneralImport drinne lässt, kriegt gleich 'ne 6.
    Ohne die genannten Einstellungen ist vb.net eine Sprache, in der man zwar (mit gutem Willen, und wenn man sich auskennt) OOP programmieren kann, aber praktisch tut's niemand.
    Also kurz: Ohne die genannten Einstellungen ist Vb.Net eine Sprache, in der nicht OOP programmiert wird.

    Kosmos_Igel schrieb:

    Gibt es eigentlich auch eine Möglichkeit eine bestimmtes Objekt zu überschreiben?
    Dassis ganz einfach - du musst die Kundin Müller in der Liste suchen, und ihren Namen ändern.
    Ich hoffe, deine Kunde-Klasse hat eine Property ID, also eine eindeutige Nummer, anhand derer du (die richtige) Frau Müller auffinden kannst. Jo, und dann deren Name-Property ändern.
    Für den Anfänger-Kurs reichts, wenn du die Liste mit For Each durchläufst - Fortgeschrittenere würden sowas mit Linq-Ausdrücken abhandeln, oder mit der List(Of T).Find(predicate)-Methode.



    Guck dir unbedingt meinen "Lehrplan" an, weil da gibts zB ein Tut, das erklärt, wie man das VisualStudio benutzt, sodass du List(Of T).Find(predicate) auch selbst hättest finden können - wenn dir nur das System, was dahintersteckt, bekannt wäre.
    Aber auch die "Fachbegriffe" sind eminent wichtig - deine Frage nach "Überschreiben" von Kunden führt nämlich leicht zu Kommunikations-Problemen, denn "Überschreiben" hat in OOP eine ganz spezielle Bedeutung (ist ein Fachbegriff, relativ fortgeschritten, aber dennoch ein Kern-Feature von OOP)



    Also wenn du WirtschaftsInformatik-Berufschüler belehren willst, mach dich drauf gefasst, gelegentlich Schüler in der Klasse zu haben, die sich auskennen, und die dir an Kenntnissen überlegen sind.
    Mein Vorschlag: Übertrage denen Referate zu EinzelThemen, dann langweilen die sich nicht zu Tode, und der Unterricht kann sehr dabei gewinnen.
    ZB List(Of T) ist eine fabelhafte Klasse, und man sollte nix anneres mehr benutzen - aber um wirklich zu verstehen, was das ist, muss man das Konzept der Generica verstehen, also was das (Of T) bedeutet, und was das an enormen Möglichkeiten bietet.
    Gleichzeitig ist List(Of T) ein fabelhaftes Beispiel einer generischen Klasse.

    Kosmos_Igel schrieb:

    Wie meinst du das mit einer Routine?

    VB.NET-Quellcode

    1. Private Sub AppendLine(text As String)
    2. rtbAusgabe.AppendText(text & Environment.NewLine)
    3. End Sub
    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!
    @petaod Hatte ich auch im Hinterkopf, aber @Kosmos_Igel ist noch nich so weit. ;)
    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!