ListBox über DataBinding aktualisieren

  • VB.NET

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

    ListBox über DataBinding aktualisieren

    Hi,

    ich habe die List Box "lstDirectories" mit DataBinding definiert.

    Die List Box wird nun mit der Prozedur "AccessDirectory" wie folgt befüllt:

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Dim directories As New List(Of DirectoryInfo)
    3. Private Sub AccessDirectory(ByRef strBaseDirectory As String)
    4. Me.Text = strBaseDirectory
    5. 'Get all directories in base directory
    6. Dim alldirectories = New DirectoryInfo(strBaseDirectory).GetDirectories
    7. directories.Clear()
    8. For Each found In alldirectories
    9. If (found.Attributes And (vbHidden + vbSystem)) > 0 Then Continue For
    10. directories.Add(found)
    11. Next
    12. 'Display directories in lstDirectories
    13. DirectoryInfoBindingSource.DataSource = directories
    14. End Sub


    Das klappt beim ERSTMALIGEN Aufruf auch ganz hervorragend. Die List Box "lstDirectories" wird fehlerfrei befüllt.

    Wenn ich die Prozedur aber NOCHMALS mit einem anderen strBaseDirectory aufrufe, dann läuft die Prozedur zwar ohne jeden Fehler durch. Aber die List Box wird nicht aktualisiert! Die Einträge bleiben aus dem vorangehenden Aufruf so stehen wie sie sind! Im Debugger sieht alles ganz vernünftig aus. Nur es funktioniert eben nicht.

    Ich habe nachgeschaut, ob es in DirectoryInfoBindingSource etwa eine Methode "Refresh" gibt ... die gibt es leider nicht! Es gibt zwar eine Menge Methoden (wie z.B. Dispose etc.) aber die tun soweit ich das ausprobiert habe nicht das was ich will.

    Wie kann ich erreichen, dass die List Box aktualisiert wird?

    LG
    Peter
    @Peter329:: Klingt blöd, ist aber so.
    Du musst die DataSource resetten:

    VB.NET-Quellcode

    1. DirectoryInfoBindingSource.DataSource = Nothing
    2. DirectoryInfoBindingSource.DataSource = directories
    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:

    Klingt blöd, ist aber so.


    Ich bin von Haus aus Mathematiker. Wenn ich alle Dinge in Visual Basic LOGISCH hinterfragen würde, da hätte ich vermutlich viel zu tun! *grins*

    Also das mit dem "resetten" klappt jetzt jedenfalls hervorragend! Wenn man weiß, wie es geht, dann ist eben alles ganz einfach.

    FreakJNS schrieb:

    Es sei denn, du benutzt eine BindingList(of T), die teilt dem Control mit, wenn sich was ändert.


    Das würde ich gern ausprobieren ... aber wo stelle ich das denn ein? Wenn ich den kleinen Pfeil an der Listbox anklicke, kommt das in der Auswahlliste nicht vor. Ich sei denn, ich übersehe da etwas. Was bei mir durchaus möglich ist ... *grins*

    sonne75 schrieb:

    Ansonsten bin ich gespannt auf weitere Antworten, ...


    Na, da will ich mal hoffen, dass du jetzt auch auf deine Kosten gekommen bist! *grins*

    Wie immer, herzlichen Dank an alle Ratgeber und
    LG
    Peter
    Ich habe mir das etwa so gedacht:

    VB.NET-Quellcode

    1. Option Strict On 'gaaaaaanz wichtig!


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim personen As New System.ComponentModel.BindingList(Of Person)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. ListBox1.DataSource = personen 'die zuweisung erfolg nur ein einziges mal
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim neuePerson As New Person("Dummy", 42)
    8. personen.Add(neuePerson) '...und die controls aktualisieren sich automatisch
    9. End Sub
    10. End Class



    VB.NET-Quellcode

    1. Public Class Person
    2. Public Property Name As String
    3. Public Property Alter As Integer
    4. Public Sub New(ByVal Name As String, ByVal Alter As Integer)
    5. Me.Name = Name
    6. Me.Alter = Alter
    7. End Sub
    8. Public Overrides Function ToString() As String
    9. Return Name & " (" & Alter.ToString & ")"
    10. End Function
    11. End Class


    Von nun an musst du nie wieder in iwelchen Listboxen oder Strings rumpuhlen. Ein Element aus der Personen-Liste enthält alle Informationen - direkt zugreifbar und typisiert. Außerdem musst du die Control-Datasources nicht 'resetten'. Nachteil an der BindingList ist, dass die schönen Sortier-Funktionen der List(of T) nicht dabei sind. Aber das hat man auch schnell gelöst.


    Edit: Selffail von mir, du warst nicht der, der Zeug aus Strings puhlt xD