custom WinForms-BindingSource: Zuordnung zu interner Liste als Datenquelle scheint nur mit asynchronem Konstruktor zu funktionieren [gelöst]

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    custom WinForms-BindingSource: Zuordnung zu interner Liste als Datenquelle scheint nur mit asynchronem Konstruktor zu funktionieren [gelöst]

    Hallo zusammen.

    Ich habe eine Merkwürdigkeit bei der Modifizierung einer BindingSource entdeckt und stehe vor einem Rätsel. Erstmal der Code:

    VB.NET-Quellcode

    1. Public Class StrangeBindingSource : Inherits BindingSource
    2. Private ReadOnly InternalList As New List(Of String)
    3. Public Sub New()
    4. 'Init()
    5. InitAsync()
    6. End Sub
    7. Private Sub Init()
    8. DataSource = InternalList
    9. End Sub
    10. Private Async Sub InitAsync() 'Auslagerung der Initialisierung, da der Konstruktor nicht mit Async modifiziert werden darf
    11. Await Threading.Tasks.Task.Delay(1)
    12. Init()
    13. End Sub
    14. Public Sub CheckDataSource()
    15. If DataSource Is InternalList Then Stop
    16. Stop
    17. End Sub
    18. End Class


    Rufe ich im Konstruktor die Sub Init() auf, sagt mir die Methode CheckDataSource(), dass DataSource nicht gleich InternalList ist. Verwende ich hingegen InitAsync(), klappt es.
    Warum ist das so? Was habe ich übersehen? Was läuft intern noch ab, was InitAsync() funktionieren lässt, Init() aber nicht? Habe es auch schon mit dem hier probiert, ohne Erfolg:

    VB.NET-Quellcode

    1. Private Sub Init()
    2. RaiseListChangedEvents = False
    3. SuspendBinding()
    4. DataSource = InternalList
    5. ResumeBinding()
    6. RaiseListChangedEvents = True
    7. End Sub

    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.
    Na, Moment. Ich vermute, dass Du in ner Consolenapp bist (Sub Main()). Da geht es bei mir auch, habe ich jetzt festgestellt. Es geht bei mir aber um eine WinForms-App. Und da läuft es bei mir nicht.
    Oha, das habe ich ja gar nicht explizit im Titel angegeben.

    ##########

    Relevanter Unterschied dürfte wohl sein, dass ich die BS auf's Form ziehe. Aber laut Debugger wird der Konstruktor nach Programmstart durchlaufen.
    Hm … irgendwie werd ich das Gefühl nicht los, dass es was mit der FormX.Designer.vb zu tun hat. BeginInit/EndInit kommt mir gerade in den Unsinn.
    Bilder
    • StrangeBindingSource.png

      29,97 kB, 635×715, 63 mal angesehen
    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.

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

    Die Designer.VB grätscht mir rein, die Sau!
    Ah, hast Du auch gefunden, ok. Dann muss ich da noch nen Weg suchen, wie ich das verhindern kann. Außer mit Async.

    Ah ja:

    VB.NET-Quellcode

    1. Private Sub StrangeBindingSource_DataSourceChanged(sender As Object, e As EventArgs) Handles Me.DataSourceChanged
    2. If DataSource IsNot InternalList Then DataSource = InternalList
    3. End Sub

    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.