List(of String) in ListBox

  • VB.NET

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

    List(of String) in ListBox

    Hallo,
    ich wollte mal fragen wie es möglich ist die Items einer List(of String) in eine ListBox zu bekommen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public ErrorList As New list(Of String)
    3. ErrorList.Add("Irgendwas")
    4. ErrorList.Add("Irgendwas anderes")


    VB.NET-Quellcode

    1. Public Class Form2
    2. Listbox1.Datasource = Form1.ErrorList



    Ich hab das hier schon versucht aber hat nicht geklappt.
    MfG xKekskiller
    5 Regeln für sinnvolles Fragen
    Und generell ist zu sagen:
    Keine Strings in die File-Listbox!
    Das mit DataSource hast Du (fast) richtig erkannt.
    Und ich denke, ich weiß schon, was passiert.
    Es kommt eine Exception, die irgendwas über einfaches Datenbinden o.ä. erklärt.
    Du musst die List(Of T) zuerst mit der .ToArray()-Funktion in ein Array konvertieren und dieses der DataSource-Eigenschaft zuweisen.
    Das Problem dabei ist, dass dadurch das eigentliche Binding verloren geht. Wenn Du die Liste veränderst, wird die ListBox nicht aktualisiert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hmmm,

    ich hab im Threadstart nix von Dateien gelesen...

    naja, falls es doch gebraucht wird (und wirklich nix mit Files zu tun haben sollte):

    also in Form1 bauste deine ErrorList zusammen und in Form2 brauchst du die?

    Okay, in Form 1 is ne Public Property ErrorList

    Dann probier mal in Form2 so:

    VB.NET-Quellcode

    1. For Each eintrag in Form1.ErrorList
    2. Listbox1.Items.Add(eintrag)
    3. Next
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    kann ich leider nicht sagen weil sich noch ein anderer Fehler eingeschlichen hat. ich kann nichtmal items zu meiner ErrorList hinzufügen.

    VB.NET-Quellcode

    1. Private Class Form1
    2. Dim ErrorList As List(of String)
    3. Private Sub Error()
    4. ErrorList.Add("Error1")
    5. End Sub
    6. End Class


    da bekomm ich einen fehler der sagt das ich da noch NEW schreiben muss.

    VB.NET-Quellcode

    1. Dim ErrorList As New List(of String)

    wenn ich das gemacht hab kann ich zwar items hinzufügen aber die werden durch die for each schleife nicht in die listbox eingetragen.
    @Marsianer: Es geht nicht speziell um Dateipfade, sondern um das Binding-Prinzip generell.

    @xKekskiller:
    Formübergreifend über Standardinstanzen zu arbeiten ist sehr unsauber.
    Form1 ist eine Klasse, keine Instanz einer Klasse.
    VB biegt das über die Standardinstanzen hin, dass dann im Code nicht `Form2.Show` steht, sondern `Application.OpenForms("Form2").Show` (ob ein String als Schlüssel verwendet wird weiß ich nicht mehr so genau).

    Also erstens:
    In Form1 deklarierst Du eine Variable, die Deine Form2 darstellt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ErrorDialog As New Form2
    3. 'In der OnLoad- oder OnShown-Sub oder im Konstruktor:
    4. f2.Show()
    5. 'Weitergehend in Deiner Methode, die eigentlich nicht "Private Sub Error()" heißen darf, weil "Error" ein Schlüsselwort in VB ist:
    6. ErrorDialog.SetDisplayedErrors(ErrorList)
    7. End Class


    Und damit ergibt sich dann auch schon der zeite Punkt:
    Die Klasse Form2 hat eine Methode `Public Sub SetDisplayedErrors(Errors As IEnumerable(Of DerTypEinesSolchenErrorsDerWahrscheinlichStringIst))`.
    Diese Methode wird aus der Form1-Instanz heraus aufgerufen und veranlasst das Aktualisieren der ListBox:

    VB.NET-Quellcode

    1. ListBox1.Items.Clear()
    2. ListBox1.Items.AddRange(Errors)



    PS: Ganz wichtig! Gib den Controls und Klassen sinnvolle Namen, damit man die Funktionen der TextBox1 bis TextBox58310241 nicht auswendig wissen muss, sondern die Funktion schon am Namen erkennt.


    Edit: Zum Problem mit dem Items hinzufügen:
    Die Variable ErrorList ist noch nicht instanziert. Wenn Du mal hineindebuggst (die Zeile auswählen, F9 drücken und Debugging starten), dann siehst Du, dass ErrorList Nothing ist, wenn Du mit der Maus darüber fährst.
    Die Meldung, dass du New verwenden sollst, ist zwar in diesem Fall richtig, behebt aber das eigentliche Problem nicht (nämlich dass Du anscheinend nicht weißt, was eine Instanz ist).
    Lies Dir nochmal das allererste durch, was ich in diesem Thread gepostet habe (der Link).
    Wir müssen hier rätselraten, was bei Dir eigentlich falsch ist. In diesem Fall ist es noch einfach, weil relativ schnell ersichtlich ist, dass ErrorList nicht instanziert ist. Und wenn man die Message der NullReferenceException oft genug gesehen hat, kommt einem
    da bekomm ich einen fehler der sagt das ich da noch NEW schreiben muss.
    doch recht bekannt vor.
    Aber es ist für uns elementar wichtig, dass Du uns sagst, was denn überhaupt passiert. "Funktioniert nicht" oder "Da kommt ein Fehler" reicht einfach nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    xKekskiller schrieb:

    hier zum Lesen verständlicher.
    Nicht immer.
    Wenn es nur um die Funktion innerhalb einer Methode geht, z.B.

    VB.NET-Quellcode

    1. Private Sub Button1_Click() Handles Button1.Click
    2. Dim Input = {3, 1, 6, 8, 3, 5, 7}
    3. 'Hier Sortierungsalgorithmus einfügen
    4. MessageBox.Show(String.Join(", ", Output))
    5. End Sub

    , dann ist das kein Problem.
    Aber bei Deiner Problemstellung ist es durchaus nötig, zu wissen, was z.B. Form2 macht. Ich habe oben mit ErrorDialog mal ins blaue geraten.

    Also wenn Du die Controls normalerweise aussagekräftig benennst, dann bin ich erleichtert :thumbsup:
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils