DataSet - alle Items aus eingeschachtelter DataTable anzeigen

  • VB.NET
  • .NET 4.5

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

    DataSet - alle Items aus eingeschachtelter DataTable anzeigen

    Hallo ihr lieben,
    ich habe mal wieder eine eher grundsätzliche Frage.
    In meinem DataSet gibt es eine Table Supplier und eine Table Article.
    Diese beiden stehen in einer Beziehung, dass es für jeden Article einen Supplier gibt - in der Table Article ist also der Fremdschlüssel, der auf die Supplier verweist enthalten.
    Wenn ich nun alle Article in einem DGV anzeigen (und bearbeiten) möchte, ziehe ich das Article DGV aus den Datenquellen auf die Form.
    Möchte ich nur Article eines bestimmten Supplier angezeigt bekommen, ziehe ich aus den Datenquellen die in Suppler eingeschachtelten Article auf die Form.

    Wie ist das vorgehen, wenn ich beides möchte?
    Also einen Supplier auswählen und nur dessen Article angezeigt bekommen, aber auch auf einen Button zum Beispiel klicken, um alle Article angezeigt zu bekommen?

    Brauche ich dann tatsächlich beide DGVs - deren Anzeige ich zum Beispiel über ein SplitContainer mit versteckten Panels regel - oder geht das auch mit einem DGV (und einer BindingSource)?
    Geht schon. Du schaltest einfach bei der DGV-Property DataSource zwischen den BindingSources hin und her. Standardmäßig werden ja 2 Artikel-BSs erzeugt. Eine, die als Datenquelle das tDS hat, eine, die als Datenquelle die Supplier-BS hat. Und das kannst Du nutzen, indem Du eine dieser beiden als DGV-DataSource festlegst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Lieber @VaporiZed
    Ich danke dir für deine Blitzantwort :o)

    Das ganze habe ich jetzt in einer Demo Anwendung umgesetzt.
    Könntest du hier mal bitte rüberschauen, ob meine Logik so Sinn macht?

    Edit: Ich habe vergessen die ArticleBindingSources umzubenennen. Das wäre hier wohl sehr sinnvoll...
    ArticleBindingSource ist also die "normale" BS. ArticleBindingSource1 ist die eingeschachtelte. (auch wenn du dir das bestimmt selber denken kannst :)
    Dateien
    • BSTest.zip

      (115,55 kB, 8 mal heruntergeladen, zuletzt: )

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

    Ich hab das mal bisserl gehübscht:
    • Den Deppen-Namespace entfernt, und paar andere unnötige auch
    • FileInfo weiss selbst, ob es existiert
    • eine Checkbox eingeführt statt eines Buttons - damit man "Alle Anzeigen" auch zurücknehmen kann
    • Zuweisungen an Combobox.Text sind nicht sinnvoll - da wird nur verborgen, was angewählt ist - angewählt isses aber trotzdem. Stattdessen verstecke ich die Combo, wenn nicht gebraucht.
    • Jo - Benamung: mit "ArticleBindingSource" und "ArticleBindingSource1" zu hantieren ist eiglich sofort tödlich.
    • DatenDatei mit ins Projekt aufgenommen
    Jo - bleibt nicht viel Code übrig:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _DataFile As New FileInfo("Data.Xml")
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. If _DataFile.Exists Then DataSet1.ReadXml(_DataFile.FullName)
    5. AddHandler ckAlleAnzeigen.CheckedChanged, AddressOf ckAlleAnzeigen_CheckedChanged
    6. ckAlleAnzeigen_CheckedChanged(Nothing, Nothing)
    7. End Sub
    8. Private Sub ckAlleAnzeigen_CheckedChanged(sender As Object, e As EventArgs)
    9. Dim checked = ckAlleAnzeigen.Checked
    10. ArticleDataGridView2.DataSource = If(checked, bsArticle, bsSupplierArticle)
    11. ComboBox1.Visible = Not checked
    12. End Sub
    13. End Class
    Dateien
    • BSTest01.zip

      (20,05 kB, 12 mal heruntergeladen, zuletzt: )

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

    So. Ich habe alles erfolgreich umgesetzt. Es hat sich aber noch eine Frage ergeben.
    Ein bisschen zur Verzweiflung gebracht hat mich EditCurrent.
    Denn ArticleBindingSource.EditCurrent(Of frmEditArticle) öffnet (logischerweise) falsche Artikel, wenn die Bindingsource eine andere (ArticleBindingSourceFiltered) ist.
    Nach diesem "Fehler" habe ich relativ lange gesucht.
    Diesen Aufruf habe ich nun wie folgt geändert und alles läuft:

    VB.NET-Quellcode

    1. Dim Source = DirectCast(ArticleDataGridView.DataSource, BindingSource)
    2. If Source.Current Is Nothing Then Exit Sub
    3. Source.EditCurrent(Of frmEditArticle)


    Aber ich verstehe nicht warum EditNew funktioniert.
    Mit ArticleBindingSource.EditNew(of frmeditArticle) kann ich auch Artikel anlegen, wenn die Bindingsource ArticleBindingSourceFiltered ist. Das verstehe ich noch.
    Aber mir wird dieser Artikel dann auch angezeigt. Das verstehe ich nicht.
    Weil der Aufruf für EditNew ​ArticleBindingSource.EditNew(of ...) lautet.
    Ich arbeite aber mit einer anderen Bindingsource Namens ArticleBindingSourceFitlered.
    Das führt bei EditCurrent zu problemen (also es wird ein anderer Artikel angezeigt, als angeklickt).
    Denn ​ArticleBindingSource.EditCurrent(of ..) ist ja nunmal nicht der Artikel den ich in der ArticleBindingSourceFiltered anklicke.

    Wenn ich also der ArticleBindingSource ein Artikel mittels EditNew hinzufüge, warum wird dieser dann auch in der ArticleBindingSourceFiltered angezeigt?
    jo, versteh ich auch nicht. Das würde ja heissen, dass der neue Datensatz den Filter-Kriterien genügt (was natürlich möglich ist, aber unwahrscheinlich).
    Oder deine bsFiltered tut "relational filtern", also nicht über die Filter-Property, sondern dadurch, dass ihre BindingSource als DataMember eine DataRelation eingetragen hat.
    Wie so oft, wenn mir nix mehr einfällt: häng SampleSolution an, die den Fehler reproduziert (aber bitte nachweislich sofort lauffähig).

    ErfinderDesRades schrieb:

    Das würde ja heissen, dass der neue Datensatz den Filter-Kriterien genügt (was natürlich möglich ist, aber unwahrscheinlich).

    Das ist unwahrscheinlich - ist aber die Voraussetzung.
    Wenn mein neuer Datensatz den FIlterkriterien nicht genügt, wird auch nix angezeigt.
    Also denke ich nicht, dass es sich um einen Fehler handelt - ich verstehs nur nicht.

    Kann ich mir die Bindingsource wie eine Schnittstelle zwischen GUI und DataSet vorstellen?
    Wie so eine Art Datenleitung?
    Ich schiebe über die ArticleBindingsource meine Daten ins DataSet - und ziehe diese über die ArticleBindingSource filtered wieder raus?
    Dabei ist dann egal, wie sie ins DataSet gelangten?
    Schnittstelle ist was anderes.

    Eine BindingSource ist eine selbstaktualisierende View auf eine DataTable.
    "Datenleitung" klingt so, als müsse man auf der einen Seite was reintun, dass woanners war rauskommt etc.

    Nein, eine View ist eine Sicht der Dinge. Jemand mit Hunger sieht einen Supermarkt anders als mw. ein Alkoholiker auf Entzug.
    Und es ist ja mehr als nur angucken, sondern ist auch interagieren.

    Jo, wenn eine BindingSource einen Datensatz ins Regal stellt, dann steht der im Regal. Wenn eine andere View diesen Datensatz sehen kann, dann sieht sie ihn.

    DerSmurf schrieb:

    Dabei ist dann egal, wie sie ins DataSet gelangten?
    Jo, das ist egal.

    (Allerdings gibts da noch einen Zwischenschritt - eine BindingSource ändert die DataTable erst, wenn bs.EndEdit() ausgeführt wird. Das passiert meist intern, manchmal muss mans explizit aufrufen.)