Fehlersuche bei befüllen einer Liste mit DataSource

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Fehlersuche bei befüllen einer Liste mit DataSource

    Moin!

    ich habe eine Funktion, die bisher auch immer ganz gut funktionert hat.

    VB.NET-Quellcode

    1. Public Sub SetControlValues(Control As System.Windows.Forms.ListBox, Data4List As Dictionary(Of String, String))
    2. If Data4List.Count > 0 Then
    3. With Control ' zuweisen der Daten
    4. Dim NewBindingSource As New BindingSource With {.DataSource = Data4List}
    5. .DataSource = NewBindingSource
    6. .DisplayMember = "Value"
    7. .ValueMember = "Key"
    8. .Enabled = True
    9. End With
    10. Else
    11. 'Todo: hier muss eventuell noch etwas ergänzt werden
    12. Control.Enabled = False
    13. End If
    14. End Sub


    Nun kommt folgende Fehlermeldung:



    Data4List hat Daten



    Dennoch verstehe ich nicht wie diese Fehlermeldung zustande kommt.

    Kann mir einer einen Tipp geben?

    Gruß Jan
    Wenn der Debugger schon dort anhält, kannst Du durch Zeigen auf die verschiedenen Variablen schauen, was da Nothing ist. Ich tippe auf Control.
    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.
    Das scheint ein Microsoft Bug im .NET-Framework zu sein. Im Refresh der CheckedListBox wird eine NullReference-Exception ausgelöst, obwohl die DataSource korrekt gesetzt wird. Habs mit verschiedenen Datasource-Typen probiert und der Fehler wird immer ausgelöst.

    Probiert habe ich folgendes:
    - List(of String)
    - List(of ListViewItem)
    - List(of T)
    - List(of KeyValuePair(of Integer, String))
    - Bindinglist(of T)
    - Bindinglist(of String)
    - Bindingsource(List(of T), "Text")

    DataSource wurde gesetzt:
    - Im Konstruktor direkt nach InitializeComponent
    - Load()
    - Shown()
    - Button-Click Event

    Resultat immer das gleiche: NullReference-Exception beim Setzen der DataSource im Control.Refresh(). DataSource wird trotzdem sauber gesetzt und es wird keine Fehlermeldung geworfen. Der folgende Code wird ebenfall sauber ausgeführt.
    Bilder
    • Bug.PNG

      37,02 kB, 758×423, 64 mal angesehen
    • LäuftTrotzdem.PNG

      13,35 kB, 815×493, 73 mal angesehen


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    probiert mit DataSource am ende ?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ReadOnly s1 As New Dictionary(Of String, String)
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. CheckedListBox1.CheckOnClick = True
    5. s1.Add("abc", "def")
    6. s1.Add("abc1", "def1")
    7. s1.Add("abc2", "def2")
    8. Dim mDic = s1.ToDictionary(Function(kvp) kvp.Key,
    9. Function(kvp) String.Format("{0}", kvp.Value))
    10. With CheckedListBox1
    11. .DisplayMember = "Value"
    12. .ValueMember = "Key"
    13. .DataSource = BindingSource1
    14. End With
    15. BindingSource1.DataSource = mDic
    16. End Sub
    17. Private Sub CheckedListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles CheckedListBox1.SelectedIndexChanged
    18. Dim s2 = CStr(CheckedListBox1.SelectedValue)
    19. If s2 IsNot Nothing Then
    20. Dim s3 = s1(s2)
    21. MessageBox.Show(s3)
    22. End If
    23. End Sub
    24. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    25. If CheckedListBox1.CheckedItems.Count > 0 Then
    26. Dim currentValue As String = ""
    27. For Each checkedItem In CheckedListBox1.CheckedItems
    28. currentValue = checkedItem.Value.ToString
    29. ' currentValue = checkedItem.Key.ToString
    30. Debug.Print(CStr(currentValue))
    31. Next
    32. End If
    33. End Sub
    34. End Class
    Jo, habe ich auch probiert. Wobei ein Dictionary meines Wissens nach gar nicht als DataSource verwendet werden kann, da das Binding der CheckedListBox nur IList unterstützt.
    Wenn ich aber DisplayMember und ValueMember vor der DataSource setze, dann wird das ignoriert und ich habe die Variablenbezeichnungen in der Auflistung.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Okay, ja so löst es keinen Fehler aus. Musste ein bisschen was umstellen, aber das scheint zu klappen:

    VB.NET-Quellcode

    1. Public Class Example
    2. Private Sub BtnGetCheckedExamples_Click(sender As Object, e As EventArgs) Handles BtnGetCheckedExamples.Click
    3. Dim strMessage As String = String.Empty
    4. For Each Example As Element In ClbExamples.CheckedItems
    5. strMessage &= Example.Text & Environment.NewLine
    6. Next
    7. MessageBox.Show(strMessage)
    8. End Sub
    9. Private Sub Example_Load(sender As Object, e As EventArgs) Handles Me.Load
    10. Dim LstElements As New List(Of Element) From {New Element With {.ID = 1, .Text = "Beispiel1"},
    11. New Element With {.ID = 2, .Text = "Beispiel2"},
    12. New Element With {.ID = 3, .Text = "Beispiel3"},
    13. New Element With {.ID = 4, .Text = "Beispiel4"},
    14. New Element With {.ID = 5, .Text = "Beispiel5"}}
    15. Dim BSource As New BindingSource
    16. With ClbExamples
    17. .DataSource = BSource
    18. BSource.DataSource = LstElements
    19. .ValueMember = "ID"
    20. .DisplayMember = "Text"
    21. End With
    22. End Sub
    23. End Class
    24. Public Class Element
    25. Public Property ID As Integer
    26. Public Property Text As String
    27. End Class



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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