2 Bindingsourcen der gleichen Tabelle beeinflussen sich gegenseitig

  • VB.NET
  • .NET (FX) 4.0

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    2 Bindingsourcen der gleichen Tabelle beeinflussen sich gegenseitig

    Ich habe 2 Comboboxen, die auf die gleiche Tabelle verweisen, aber unterschiedlich sortiert werden sollen.
    Dazu habe ich 2 Bindingsource angelegt. Nur nach der Abkürzung sortieren klappt einwandfrei. Wenn ich jedoch die 2. Bindingsource nach Namen sortiere, wird die erste Sortierung nach Abkürzung überschrieben.
    Wie kann ich die beiden Comboboxen unabhängig voneinander sortieren ?

    VB.NET-Quellcode

    1. Private Sub mnuStreckeBst_Click(sender As Object, e As EventArgs) Handles mnuInfrastruktursuche.Click
    2. Dim bsAbk As New BindingSource
    3. Dim bsName As New BindingSource
    4. With bsAbk
    5. .DataSource = InfrastrukturDB.DB100
    6. .Sort = InfrastrukturDB.DB100.ABKColumn.ColumnName
    7. End With
    8. With bsName
    9. .DataSource = InfrastrukturDB.DB100
    10. .Sort = InfrastrukturDB.DB100.NameColumn.ColumnName
    11. End With
    12. With Me.tspcboAbk.ComboBox
    13. .DataSource = bsAbk
    14. .DisplayMember = InfrastrukturDB.DB100.ABKColumn.ColumnName
    15. .ValueMember = InfrastrukturDB.DB100.ABKColumn.ColumnName
    16. .SelectedIndex = -1
    17. End With
    18. AddHandler tspcboAbk.SelectedIndexChanged, AddressOf tspcboAbk_SelectedIndexChanged
    19. With Me.tspcboBstName.ComboBox
    20. .DataSource = bsName
    21. .DisplayMember = InfrastrukturDB.DB100.NameColumn.ColumnName
    22. .ValueMember = InfrastrukturDB.DB100.ABKColumn.ColumnName
    23. .SelectedIndex = -1
    24. End With
    25. AddHandler tspcboBstName.SelectedIndexChanged, AddressOf tspcboBstName_SelectedIndexChanged
    26. Hoeheanpassen(45 + Me.tspMAsuche.Height)
    27. Me.tspMAsuche.Visible = False
    28. Me.tspInfrastruktur.Visible = True
    29. End Sub
    nein kein C&P Fehler, war so gewollt, da ich in beiden Fällen die Abk zurückbekommen möchte.
    Die Abkürzung kann leider auch mehrfach in diversen Zeiträumen auftreten, aber das wird bewußt später ausgewertet und angezeigt.
    Wie ich diese allerdings nur einmalig eindeutig in die Comboboxen bekomme weiß ich auch noch nicht.
    Nur einmal so schematisch:

    VB.NET-Quellcode

    1. '
    2. 'BindingSource_1
    3. '
    4. Me.BindingSource_1.DataMember = "Tabelle"
    5. Me.BindingSource_1.DataSource = Me.DtsTest
    6. Me.BindingSource_1.Sort = "Text1"
    7. '
    8. 'Text1ComboBox
    9. '
    10. Me.Text1ComboBox.DataSource = Me.BindingSource_1
    11. Me.Text1ComboBox.DisplayMember = "Text1"
    12. Me.Text1ComboBox.ValueMember = "Text1"
    13. '
    14. 'BindingSource_2
    15. '
    16. Me.BindingSource_2.DataMember = "Tabelle"
    17. Me.BindingSource_2.DataSource = Me.DtsTest
    18. Me.BindingSource_2.Sort = "Text2"
    19. '
    20. 'Text2ComboBox
    21. '
    22. Me.Text2ComboBox.DataSource = Me.BindingSource_2
    23. Me.Text2ComboBox.DisplayMember = "Text2"
    24. Me.Text2ComboBox.ValueMember = "Text2"
    Ich habe das Ganze mit dem Designer fabriziert und oben die relevanten Teile angeführt. Bei mir sortieren die BS unabhängig voneinander...
    Nach dem Code müsste es gehen, wie du denkst, so leidlich.
    Also wird der Mist wohl iwo im anderen Code gebaut sein.
    Wie vb1963 anregt: Mach solche Geschichten wenns irgend geht im Designer.
    Es ist zB recht katastrophal, dass du bei jedem Klick auf diesen Button neue BindingSources anlegst, und ein komplettes kleines BindungsSystem jedesmal neu re-konfigurierst.
    Mit sowas hat man viel Arbeit, viel Code, viel Ärger.
    Daher machs lieber im Designer, dann wird nur einmal konfiguriert, und hopefully richtig.

    Aber es gibt tatsächlich ein Problem: ToolstripCombobox-Databinding kann man nicht im Designer machen. Da wären dann doch je Combo 2 Zeilen zu schreiben, aber die haben wie gesagt nichts im mnuInfrastruktursuche.Click-Event verloren.

    Databinding-Setup gehört in den Designer, und notfalls ins Form-Startup, also Sub New, Form_Load oder Form_Shown - nicht woanners.
    Die Ursache habe ich erstmal, Ich hatte als Datasource die Tabelle eingegeben und nicht in Datasource und Datamember unterteilt.
    So siehts jetzt funktionierenderweise aus.

    VB.NET-Quellcode

    1. Dim bsAbk As New BindingSource
    2. Dim bsName As New BindingSource
    3. With bsAbk
    4. .DataSource = InfrastrukturDB
    5. .DataMember = InfrastrukturDB.DB100.TableName
    6. .Sort = InfrastrukturDB.DB100.ABKColumn.ColumnName
    7. End With
    8. With bsName
    9. .DataSource = InfrastrukturDB
    10. .DataMember = InfrastrukturDB.DB100.TableName
    11. .Sort = InfrastrukturDB.DB100.NameColumn.ColumnName
    12. End With


    @EDR Deine Tips werde ich mir noch mal ansehen. Mein Philosophieproblem besteht darin, das ich die entsprechenden Bindungen erst realisieren wollte, wenn sich der Nutzer entscheidet was er aufgerufen haben möchte.
    Das bringt zwar am Anfang kleine Effekte aber spätestens ab dem 2. Klick ist es sinnlos, da muß ich mir das Konzept noch mal ansehen.
    Da ich verschiedene Formulare mit den gleichen Tabellen in unterschiedlichen Kombinationen ansteuere, habe ich mir eine Dataset Klasse angelegt. Kann ich die auch per Designer ansteuern ?
    Was meinst du mit "Dataset-Klasse anlegen"?
    Hoffentlich, dass du deim Projekt ein typisiertes Dataset zugefügt hast, so wie hier gezeigt? vier Views-Videos

    Und was meinst du mit "Dataset per Designer ansteuern"?
    Für typDatasets gibts einen eigenen Designer (sieht man in den Videos), aber da steuert man nichts an, sondern man konfiguriert.

    Auch im Form-Designer konfiguriert man, aber nicht das typDataset, sondern man konfiguriert, was daran gebunden wird (BindinSources, und an die wiederum die Controls des Forms).

    Und es ist eine Spezial-Baustelle, wenn du mit demselben typDataset auf mehreren Forms arbeiten willst.
    Es ist lösbar, aber es ist halt speziell, und imo sollte man den anderen Kram beherrschen, ehe man sich an form-übergreifendes Databinding macht.
    Auch zu diesem SpezialThema habich Tuts und Bibliotheken gebastelt, aber wie gesagt: Eins nachm anneren.

    @WhitePage: ToolstripComboboxen sind auch was spezielles. Es sind keine Toolstrips, sondern sind ToolstripItems, und da ist auch eine richtige Combobox drinne.
    Von daher, das Event ist prinzipiell korrekt - (nur wirds an der Stelle vielfach abonniert, und so für Chaos sorgen).

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

    Ich verwende typisierte Datasets, die jeweils in einer Klasse sind. (Im Projektexplorer über Hinzufügen Dataset)
    Die Übergabe der Datasets zwischen den Formularen löse ich je nach Bedarf entweder Tabellenweise oder als ganzes Dataset per property.
    Ob ich allerdings die Datasets im Formulardesigner ansprechen kann weiß ich nicht so recht, deswegen alles per Code.
    Die Formulare sind auch im Regelfall nicht gleichzeitig offen, sondern werden nach Bedarf eingeblendet.

    Schoofi schrieb:

    Ob ich allerdings die Datasets im Formulardesigner ansprechen kann weiß ich nicht so recht, deswegen alles per Code.

    jo, das geht nämlich standardmäßig nicht, und da muss man was basteln, dass das geht.
    Täte ich aber empfehlen, das zu basteln, denn alles per Code kann sehr viel werden und wird immer mehr und immer unsicherer - siehste ja, wie schnell man da Fehler eingebaut hat.
    Hingegen im Designer konfiguriertes funktioniert richtig (zumindest fast immer), und ein weiterer wichtiger Pluspunkt ist das Wysiwyg, was die Designer bereitstellen.

    Ich bezeichne die Designer immer als das "Visual" vom VisualStudio.
    Nach dem Ansehen Deiner Tuts habe ich mal versucht das Dataset direkt in den Formularen zu binden.
    Die Bindungen haben auch soweit funktioniert.
    Nun habe ich allerdings das Problem, das die Tabellen nicht gefüllt sind.
    Erschwerdend kommt dazu, das die Lage der Datenbank erst zur Laufzeit festgelegt wird.
    Ich habe allerdings eine Instanz des Datasets=Infodb, in der die Tabellen gefüllt sind.
    Kann ich diese der Bindingsource zuweisen ?
    Meine Idee sah jetzt folgendermaßen aus.

    VB.NET-Quellcode

    1. Using frmInfo As New frmInfo
    2. frmInfo.DsInfodb = InfoDB
    3. frmInfo.Tbl_InfosBindingSource.Find("ID_Info", selectednodInfo.ID)
    4. frmInfo.ShowDialog()
    5. End Using

    die Zuweisung an frmInfo.DsInfodb klappt auch, die Daten sind dort angekommen.
    Nur in der Bindingsource sind in der Vorschau keine Daten sichtbar.
    Wie kann ich realisieren, das ich nur eine gefüllte Instanz des typisierten Datasets vorhalte und an alle Formulare übermittle?
    Jo, formübergreifendes Databinding ist nochmal was spezielles.
    Ist richtig, dass du das befüllte Dataset weiterzugeben versuchst, nur musst du auch noch die BindingSources umstöpseln, die sind ja noch immer an das olle Dataset gebunden, was garnet befüllt wurde.

    Ich hab da eine so einiges erschlagende Lösung zu entwickelt: Daten laden, speichern, verarbeiten - einfachste Variante
    Danke, ich dachte erst das das Dataset und die Bindingsource direkt in Verbindung stehen, aber offensichtlich muß jede Bindingsource einzeln gebunden werden, zumindest habe ich keine Auflistung gefunden, mit der sich das vereinfachen ließe.
    Lässt sich durchaus vereinfachen:
    Hänge nicht alle BindingSources an das Dataset, was dir der Form-Designer hingeneriert, sondern hänge sie an eine MainBindingSource, die wiederum am Dataset hängt.
    Dann brauchst du später nur noch diese MainBindingSource umstöpseln, und alle davon abhängigen BS sind mit-umgestöpselt.
    Dann hastes selbst gemacht, und händisch, und muss man mit jedem Form neu machen (kein Beinbruch, durchaus leistbar).

    Oder nimm die Lösung aus dem verlinkten Tut. Da steckt allerdings allerlei komplizerter Code hinter, der nicht gemacht ist, um von jedermann verstanden zu werden - wohl aber die richtige Benutzung ist erlernbar (und reduziert dann den erforderlichen Aufwand auf 1 Zeile).