BindingSource von Controls dynamisch anpassen

  • VB.NET

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

    BindingSource von Controls dynamisch anpassen

    Hallo Hallo
    Ich habe ein DGV auf der Form, welches an einer BindingSource hängt.
    Durch eine Filterung sind jedoch zwei verschiedene BindingSources möglich. (Einmal BSArtikel - zeigt einfach alle Artikel | einmal BSLieferantArtikel - zeigt alle Artikel eines Lieferanten.
    Damit ich immer auf die richtige Bindingsource zurückgreife (beim bearbeiten, löschen, etc.) gibt es diese beiden Subs:

    VB.NET-Quellcode

    1. Private Function GetUsedBindingsource() As BindingSource
    2. If _BSFilteredBySupplierIsActivated Then
    3. Return BSLieferantArtikel
    4. Else
    5. Return BSArtikel
    6. End If
    7. End Function
    8. Private Sub SetBindingSource()
    9. If _BSFilteredBySupplierIsActivated Then
    10. DGVArtikel.DataSource = BSLieferantArtikel
    11. Else
    12. DGVArtikel.DataSource = BSArtikel
    13. End If
    14. End Sub

    Alles ist prima.
    Nun habe ich aber noch 3 Textboxen, ein Label und eine ComboBox, welche an die gleiche BS gebunden werden sollen wie das DGV.
    Also wenn_BSFilteredBySupplierIsActivated dann an die BSLieferantArtikel, sonst an die BSArtikel
    Im Designer habe ich diese Controls erstmal an die BSArtikel gebunden, weils die BS ist, die beim Programmstart aktiv ist. Wenn nun nach einem Lieferanten gefiltert wird, stimmen natürlich die Werte in den Controls nichtmehr, wenn ich im DGV rumklicke.
    Ich habe also die SetBindingSource wie folgt erweitert:

    VB.NET-Quellcode

    1. Private Sub SetBindingSource()
    2. If _BSFilteredBySupplierIsActivated Then
    3. DGVArtikel.DataSource = BSLieferantArtikel
    4. AddBindingsForLabelControls(BSLieferantArtikel)
    5. Else
    6. DGVArtikel.DataSource = BSArtikel
    7. AddBindingsForLabelControls(BSArtikel)
    8. End If
    9. End Sub
    10. Private Sub AddBindingsForLabelControls(BS As BindingSource)
    11. TBLBLZ1.DataBindings.RemoveAt(0)
    12. TBLBLZ1.DataBindings.Add(New Binding("Text", BS, "LabelZeile1"))
    13. TBLBLZ2.DataBindings.RemoveAt(0)
    14. TBLBLZ2.DataBindings.Add(New Binding("Text", BS, "LabelZeile2"))
    15. TBEinheiten.DataBindings.RemoveAt(0)
    16. TBEinheiten.DataBindings.Add(New Binding("Text", BS, "AnzahlDerEinheiten"))
    17. CBMasseinheit.DataBindings.RemoveAt(0)
    18. CBMasseinheit.DataBindings.Add(New Binding("Text", BS, "Masseinheit"))
    19. End Sub

    Das klappt alles prima. Aber geht das irgendwie eleganter?

    Ich habe versucht eine eigene Bindingsource, für diese Controls zu erstellen, um dann nur die DataSource Eigenschaft dieser neuen BS ändern zu müssen. Das habe ich aber nicht hinbekommen (hatte keine Werte in den Controls)
    @DerSmurf Wenn Du einem Control eine andere BindingSource zuweisen willst, musst Du der DataSource in einem Zwischenschritt Nothing zuweisen:

    VB.NET-Quellcode

    1. Private Sub SetBindingSource()
    2. DGVArtikel.DataSource = Nothing
    3. If _BSFilteredBySupplierIsActivated Then
    4. ' ...

    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!
    Ok, das mit der eigenen BindingSource klingt zwar gut. Du hast nur vielleicht das Problem, dass Du dann einen Positionswechsel mitmachen musst. Will heißen: Wenn im DGV jetzt etwas ausgewählt wird, wird zwar die Position von dessen BindingSource geändert. Aber nicht automatisch die von Deiner TextBox-BindingSource. Das müsstest Du dann im DGV-BindingSource-CurrentChanged-EventHandler selber machen.
    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 ist einfach Mist unerfreulich, zur Laufzeit an den Controls DataSources auszuwechseln.
    Einfacher wäre es vielleicht, wenn die Controls an einer BindingSource hängen - und da bleiben dürfen. Und deren DataSource (also die der BindingSource) wird ausgewechselt.
    Eine BindingSource kann ja DataSource für eine andere BS sein.
    Aber genau das ist sein Vorhaben - so verstand ich es zumindest.

    DerSmurf schrieb:

    Ich habe versucht eine eigene Bindingsource, für diese Controls zu erstellen, um dann nur die DataSource Eigenschaft dieser neuen BS ändern zu müssen. Das habe ich aber nicht hinbekommen (hatte keine Werte in den Controls)
    Denn das habe ich versucht mit meinem Vorschlag in Post#4 zum Laufen zu bringen.
    Bilder
    • Switching BS.gif

      242,45 kB, 920×444, 66 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“ ()

    Edit: bin am Handy. Da gibt's leider keine Codetags. bitte entschuldigt.

    @ErfinderDesRades wie @VaporiZed richtig erkannt hat steht genau das ja in meinem Post.

    Ich habe im Designer die BSLabel (für die DGV fremden Controls) erstellt.
    Als dataSource habe ich meine BSMain und als Datamember die Artikel ausgewählt.
    So kann ich dann im Designer schonmal das DataBinding meiner Controls setzen.
    Dann habe ich innerhalb der Sub SetBindingSource: BSLabel.DataSource = BSLieferantArtikel, oder BSArtikel ausgeführt.
    Weil sich nach rumklicken im DGV in meinen Controls nichts ändert, dachte ich meine überlegung ist Murks.
    Aber ich versuche morgen Mal die Position meiner BSLabel nach Klick ins DGV manuell anzupassen. Muss ja die gleiche sein, wie die Position in DGV.
    Es war genau wie von @VaporiZed in Post 4 vermutet.
    Ich habe die Bindingsource BSEtikettenDaten (die zuvor BSLabel hieß) wieder hinzugefügt. Als DataSource habe ich im Designer die BSArtikel ausgewählt und im Designer die DataBindings meiner Controls gesetzt.
    Den SetBindingSource Code habe ich auf die neue BindingSource angepasst.

    VB.NET-Quellcode

    1. Private Sub SetBindingSource()
    2. If _BSFilteredBySupplierIsActivated Then
    3. DGVArtikel.DataSource = BSLieferantArtikel
    4. BSEtikettenDaten.DataSource = BSLieferantArtikel
    5. Else
    6. DGVArtikel.DataSource = BSArtikel
    7. BSEtikettenDaten.DataSource = BSArtikel
    8. End Sub


    Und die Position der neuen BS setze ich auf den gleichen Wert wie in der BS am DGV, wenn sich dort BS.Current ändert.

    VB.NET-Quellcode

    1. ​Private Sub BS_CurrentChanged(sender As Object, e As EventArgs) Handles BSLieferantArtikel.CurrentChanged,
    2. BSArtikel.CurrentChanged
    3. BSEtikettenDaten.Position = DirectCast(sender, BindingSource).Position
    4. End Sub