DataSet - Bei eingeschachtelter BindingSource funktioniert ".Find()" nicht

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

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Noyne.

    DataSet - Bei eingeschachtelter BindingSource funktioniert ".Find()" nicht

    Hallo Leutz!!

    Ich habe ein "Problem".
    Und zwar habe ich auf meinem Form u.a. eine BindingSource, wo Heime drin stehen und deren eingeschachtelte WohnbereicheBindingSource, wo (logischerweise) die Wohnbereiche des Heims drinne stehen.
    So ... Nu war meine Idee (mangels einer anderen 8| ), beim Schließen des Programms die ID des zuletzt bearbeiteten Wohnbereichs in den Settings zu speichern und beim nächsten Start exakt diesen Wohnbereich wieder anzuzeigen, wenn dasselbe Heim ausgewählt wird (wird bei jedem Start neu ausgewählt!).

    Ich geh' dabei mit folgendem Code vor:

    VB.NET-Quellcode

    1. If My.Settings.KatID <> 0 Then
    2. Dim match = WohnbereicheBindingSource.Find("HWB_ID", My.Settings.KatID)
    3. WohnbereicheBindingSource.Position = match
    4. End If

    (OT: Gab es nicht eine Tastenkombi, mit der der vordere, leere Teil nicht mitkopiert wird und damit der Code vorne anfängt?! Ich hab' sie vergessen ...)

    Wenn ich den Code ausführe, kracht er mir bei Dim match = WohnbereicheBindingSource.Find("HWB_ID", My.Settings.KatID) mit einer ArgumentException raus, die besagt "Die DataMember-Eigenschaft HWB_ID kann in der DataSource nicht gefunden werden.", was an sich auch logisch ist, denn es ist ja nicht eine normale WohnbereicheBindingSource, sondern die beim Heim eingeschachtelte!!!

    Jetzt wollte ich wissen, ob da die DataMember-Eigenschaft "HWB_ID" einfach anders heißt und meinethalben nur ein Präfix fehlt oder, ob das mit dem ".Find" bei eingeschachtelten BindingSources einfach nicht funktioniert ...

    Kann mir einer bitte helfen?!

    GLG, eure Noyne :D
    Your computer is running... You better go chase it! :P :D
    als Anfänger würde ich sagen:
    Wenn eine Relation zwischen beiden Tabellen besteht, dann solltest Du mit

    VB.NET-Quellcode

    1. Dim match = HEIMBindingSource.Find("HWB_ID", My.Settings.KatID)
    zum Ziel kommen...
    "Hier könnte Ihre Werbung stehen..."
    wie ist den Dein Datenmodell aufgebaut? ist der Wohnbereich ein extra Form? oder wie sieht das aus?

    wohnbereich ist doch der Heim untergeordnet oder? dann muss Wohnbereich irgendeine Zuordnung zu Heim haben, das geschieht meist über die Primary Keys. wenn das dann so ist, dann nimmt man aus der HauptDataTable die Untergeordnete Tabelle und dann weis auch die Binding Source welche ID wo gemeint ist!
    "Hier könnte Ihre Werbung stehen..."
    Das ist die Theorie!!
    Wenn ich jetzt hingehe auf meine Wohnbereiche-Form und den Code 1:1 dort einfüge, selectiert er mir auch den gewünschten DS, weil die "Abfrage" direkt auf die WohnbereicheBindingSource geht!!

    Auf meinem MainForm setz' ich allerdings nen Filter auf meine HeimBindingsource, sodass ich immer nur genau ein Heim am Wickel hab! Dadurch, dass ich die untergeorndete Wohnbereiche-BS nutze, werden mir in einer Combobox auch nur die Wohnbereiche angezeigt, die zu dem Heim gehören (spart die Filterei der Wohnbereiche-BS) ... Putzigerweise geht da dann mein Find in die Binsen, weil ich nicht die Wohnbereiche-BS als DataSource habe und auch nicht die Wohnbereiche als DataMember, sondern eben DataSource = HeimBindingSource und DataMember = HeimWohnbereiche (Die Relation der beiden Tabellen) ...

    Okay, ich glaub' ich seh grad das Problem ...
    "Die DataMember-Eigenschaft HWB_ID kann in der DataSource nicht gefunden werden." ... Logisch ... DataSource ist ja auch die Heim-BS und nicht die Wohnbereiche-BS ...

    Trotzdem!! Kann ich in der untergeordneten BindingSource wirklich nicht mit ".Find" arbeiten?! Oder gibt's da ein Hintertürchen?!
    Your computer is running... You better go chase it! :P :D
    Hmmm... da müsste einer der DB Profis mal was zu sagen.... meiner Meinung nach geht das nur, wemm HBW_ID auch in der Wohnbereiche Source drin ist. also bräuchtest Du quasi auch eine Relation zwischen Heim und Wohnbereich... zum Beispiel das die im Wohnbereich Sektor das zugehörige Heim angezeigt wird als Combobox oder Textbox.... das wäre dann DataValue = HWB_ID und DataMember=HWB_Name oder so... dann würde auch der .Find funktionieren....

    gehe ich mal von aus als Laie....

    P.S. ich habe bei mir so eine ähnliche Konstellation (Hersteller und Fassungen). Ich hab da aber nur eine Binding Source, weil Fassung eine untergeordnete Tabelle von Hersteller ist. in der Form habe ich beide Tabellen nebeneinander (kannst du aber auch durch TabControl auf 2 Tabs aufteilen). Der Vorteil ist, das Du in deiner Tabelle Hersteller (Heim) dann eine weiter Tabelle hast, Fassung (Wohnbereiche). und die BindingSource kannst du dann Filtern und matchen wie du willst, du hast immer die gleiche Source...
    "Hier könnte Ihre Werbung stehen..."
    Die beiden Tabellen sind natürlich über IDs miteinander verbunden ...

    Heim:
    ID
    Name
    Strasse
    usw.

    Wohnbereiche:
    ID
    Heim_ID (Foreign Key)
    Bezeichnung
    usw.

    Die Relation der beiden Tabellen unternannter ist bei meiner Wohnbereiche-BS das DataMember (HeimWohnbereiche)

    Ich denke, das Problem ist halt, dass ich die untergeordnete BindingSource nutze ... Aber müsste da nicht trotzdem dieses .Find funktionieren?!
    Your computer is running... You better go chase it! :P :D
    Nö, denke nicht das das funktioniert weil die Bindingsource von Wohnbereiche die Relation nicht kennt, die kennt nur die HeimBindingSource.
    Zieh doch aus deiner Tabelle Heim die untergeordnete Tabelle Wohnbereiche raus auf dein DGV, dann hast du doch nur noch EINE Binding source.
    Wahrscheinlich hast du die Tabelle Wohnbereiche einfach aufs DGV gezogen, das ist falsch.... guck mal mein Beispiel (Bildchen).
    Die Tabelle Fassung lasse ich unberührt, da ich die verknüpfte Tabelle Fassung aus der Tabelle Hersteller benutze.... die zeigen dann BEIDE auf ein und die selbe BindingSource
    Bilder
    • DataSet.PNG

      6,54 kB, 235×280, 97 mal angesehen
    "Hier könnte Ihre Werbung stehen..."

    ErfinderDesRades schrieb:

    Es gibt die Spalten ID, Heim_ID, aber HWB_ID sehe ich nicht (in post#7).
    Ne, ne, die Spalten oben sind nur beispielhaft ... Die HWB_ID ist die richtige Bezeichnung!! Bei unsren Tabellen haben alle Felder ein Präfix ... auch das ID-Feld ... "HWB_ID" stimmt schon!! Also das Feld ist existent!!
    Your computer is running... You better go chase it! :P :D

    MichaHo schrieb:

    Zieh doch aus deiner Tabelle Heim die untergeordnete Tabelle Wohnbereiche raus
    Ich bin doch nich SOOO blöd!!! Genau die untergeordnete BindingSource hab ich doch genommen!!! Sonst würde ja auch alles klappen!! Hätte ich nicht die untergeordnete BS genommen, würde das mit dem .Find auch funktionieren!!! Nur bei der untergeordneten funktioniert es eben nicht!!

    EDIT: Sorry für meinen Gefühlsausbruch, aber ich arbeite nicht erst seit gestern mit dem DataSet ...
    Wenn du dir mal die Bilderlis anguckst, die ich angehängt hab, siehst du das Grundproblem!! Nämlich die unterschiedlichen DataSources und DataMember ...
    Die, die als DataSource "ANABOXDS" hat, dort kann ich ".Find" benutzen ... Bei der mit "DataSource = HeimBindingSource" geht es nicht und ich versteh' nicht warum ...
    Bilder
    • normale BS.png

      8,89 kB, 276×272, 102 mal angesehen
    • untergeorndete BS.png

      8,77 kB, 264×268, 97 mal angesehen
    Your computer is running... You better go chase it! :P :D

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

    (ich hasse es, wenn zu einer Frage ein falscher Input gegeben wird.)

    ansonsten weiß ich halt nicht.
    kannst du eine Testanwendung anhängen, die den Fehler reproduziert?

    Übrigens kenne ich auch ein Fehlverhalten, grad mit BindingSource.Find, grad mit untergeordneten BindingSources. Aber ohne Exception, sonder er findt einfach nicht.
    Ich hab mir dafür eine eigene Extension geschrieben, die richtig tickt.

    VB.NET-Quellcode

    1. <Extension()> _
    2. Public Function FindX(bs As BindingSource, columnName As String, Key As Object) As Integer
    3. 'BindingSource.Find funzt nicht bei relateten BindingSourcses
    4. 'FindX = bs.Find(PropertyName, Key)
    5. For i As Integer = 0 To bs.Count - 1
    6. If DirectCast(bs(i), DataRowView)(columnName).Equals(Key) Then Return i
    7. Next
    8. Return -1
    9. End Function

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

    ErfinderDesRades schrieb:

    Aber haste mal post#14 ausprobiert?
    Ne, sorry, hab ich nimmer gesehen ... Ich hab direkt ne Test-Solution gebastelt nachdem ich geschrieben hab ...
    Ich probier das erstmal ... Dann kann ich das immer noch anhängen ...

    EDIT: @ErfinderDesRades DAS IST GÖTTLICH!!! Funktioniert!!! Super Sache!!! Ein "Hilfreich" für dich, Meister des DataSets ;) :love: und ein "Erledigt" für das Thema :D

    Your computer is running... You better go chase it! :P :D

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