Child per Code in ParentChild-View auswählen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Wolfy.

    Child per Code in ParentChild-View auswählen

    Hi,

    ich mal wieder.

    Ich habe ein Typisiertes Dataset, Bindings etc. Es ist ein geschachteltes Menue mit 4 Ebenen.
    Tabelle1 = Hauptmenue
    Tabelle2 = Detail zum Eintrag im Hauptmenue
    Tabelle3 = Detail zum Detail zum Eintrag im Hauptmenue
    Tabelle4 = Detail zum Detail zum Detail zum Eintrag im Hauptmenue

    könnte man vielleicht auch anders lösen. Aber es funktioniert hervorragend.

    Nun möchte ich im Hauptmenue ein Suchfeld anlegen und nach einem Datensatz in Tabelle4 suchen (funktioniert auch).

    Aber wie kann ich nun zu diesem Datensatz springen. Der Bindingsource ist ja eventuell durch das ParentChild nicht komplett.
    Muss ich vorher in den Tabellen 1 bis 3 Datensätze deselektieren?

    Ich stehe auf der Leitung. ?(

    Wolfy schrieb:

    Nun möchte ich im Hauptmenue ein Suchfeld anlegen und nach einem Datensatz in Tabelle4 suchen (funktioniert auch).
    Wenn Du suchen kannst, dann kannst Du ja offensichtlich auch finden. Du erhältst einen Tabelle4-Eintrag. Und dann musst Du aus der BindingSource für Tabelle4 nur noch diesen gefundenen Eintrag raussuchen bzw. eben die BS-Position auf diesen Eintrag setzen.

    Wolfy schrieb:

    Muss ich vorher in den Tabellen 1 bis 3 Datensätze deselektieren?
    Das geht mit normalen BindingSources nicht. Sobald für eine BS eine Datenquelle mit mindestens einem Eintrag existiert, gibt es auch in der BS eine nicht-aufhebbare Selektion.

    Wolfy schrieb:

    Der Bindingsource ist ja eventuell durch das ParentChild nicht komplett.
    Versteh ich inhaltlich leider nicht.
    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.

    Wolfy schrieb:

    Muss ich vorher in den Tabellen 1 bis 3 Datensätze deselektieren?
    nicht nur deselectieren, sondern du musst alle übergeordneten BindingSources so selectieren, dass die ihr untergeordnete BS die richtigen Datensätze enthält.
    Also in einer 4-stufigen Hierarchie bedeutet das Anwählen eines Datensatzes der untersten Stufe immer auch das Anwählen der geeigneten Datensätze der drei darüber-liegenden Stufen.

    Ist technisch nicht so dass Problem, zumindest nicht mit meiner BindingSource.MoveToRow-Extension.
    Ich bastel mal...

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

    Jo - sowas habich nun in meine BindingSourceX - Extension-Sammlung - es ist eiglich keine BindingSource-Extension, sondern eine DataRow-Extension:

    VB.NET-Quellcode

    1. '''' <summary> stellt die angegebene DataRow auf unterster Ebene ein, sowie ihre ParentRows in den übergeordneten </summary>
    2. <Extension()>
    3. Public Sub SetAsCurrent(row As DataRow, ParamArray hierarchicalBindingSources As BindingSource())
    4. Dim relations(hierarchicalBindingSources.Length - 2) As DataRelation
    5. Dim tbls = hierarchicalBindingSources.Select(Function(x) x.DataTable).ToArray
    6. 'relation-path finden - Exception, wenn zwischen zwei Tabellen der Hierarchie nicht genau eine DataRelation besteht
    7. For i = 0 To tbls.Length - 2
    8. Dim tbl2 = tbls(i + 1)
    9. relations(i) = tbls(i).ChildRelations.Cast(Of DataRelation).Single(Function(x) x.ChildTable Is tbl2)
    10. Next
    11. 'row-hierarchie ermitteln - von unten nach oben
    12. Dim rows(hierarchicalBindingSources.Length - 1) As DataRow
    13. rows(hierarchicalBindingSources.Length - 1) = row
    14. For i = hierarchicalBindingSources.Length - 2 To 0 Step -1
    15. rows(i) = rows(i + 1).GetParentRow(relations(i))
    16. Next
    17. 'bindingSources einstellen - von oben nach unten
    18. For i = 0 To rows.Length
    19. hierarchicalBindingSources(i).MoveToRow(rows(i))
    20. Next
    21. End Sub
    Whow...

    Super schnelle Lösung.

    Also war mein Ansatz mit dem deselektieren zwar falsch... Aber ich hatte den richtigen Gedanken.

    @EDR
    Das is mal Klasse. Werde ich mir zu Gemüte führen. Im Moment bin ich damit noch überfordert.

    Ich finde die Zeichenfolge mit folgendem Code:


    VB.NET-Quellcode

    1. ​ foundindex = bdstmp.Find("TSN", suchText)
    2. Debug.Print("Index gefunden: " & foundindex.ToString)
    3. foundrow = MenueDefinition.MEbene3.Rows(foundindex)
    4. Debug.Print("ID gefunden: " & foundrow.Item("ID"))


    Zusatzinfo:
    MenueDefinition = Dataset
    MEbene0 bis 3 = Datatables


    den Code von EDR habe ich in ein Modul gepackt.
    Die Datarow der Funktion SetAsCurrent übergeben ist noch klar. Das ParamArray ... ???

    Bitte nochmals Hilfe.

    Wolfy

    Wolfy schrieb:

    den Code von EDR habe ich in ein Modul gepackt.
    In welches?
    Ich täte ja empfehlen:

    ErfinderDesRades schrieb:

    sowas habich nun in meine BindingSourceX - Extension-Sammlung - Modul





    VB.NET-Quellcode

    1. bs4.MoveToRow(myRow) ' geht ja nicht, weil vorher müssen ja die übergeordneten BindingSources richtig eingestellt sein
    2. 'daher nun:
    3. myRow.SetAsCurrent(bs1, bs2, bs3, bs4)

    Wolfy schrieb:

    Das ParamArray ... ???
    Das ist ein Schlüsselwort, und das musst du recherchieren, wozu das gut ist, und wie es wirkt.
    bitte nicht einfach den Code kopieren und wenn funktioniert nicht weiter drüber nachdenken.

    Übrigens ists noch garnet getestet.
    Möglicherweise müssen noch kleine Delays eingebaut werden.
    Vielen Dank für die Hilfe.

    @EDR: Erst wollte ich dir schreiben, dass du mich überschätzt...(was auch stimmt)

    So. habe es am Laufen.

    Musste aber in der Zeile ein minus 1 einfügen.

    VB.NET-Quellcode

    1. 'bindingSources einstellen - von oben nach unten
    2. For i = 0 To rows.Length - 1
    3. hierarchicalBindingSources(i).MoveToRow(rows(i))
    4. Next


    Wie die übergeordneten Bindingsources gesetzt werden habe ich nicht kapiert.

    Im Schwäbischen sagt man: "Du bischt halt a Käpsele" und dazu noch extrem Hilfsbereit.
    :thumbsup: