Form-übergreifendes Databinding an ein typisiertes Dataset

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von loeffel.

    Der Weg 1 ist nicht wirklich atraktiv ;)
    Ich glaube, dass ich das mit dem Weg 2 nun doch hinbekommen habe. Bin gespannt ob ich Gande vor euch finde ;-). Im Anhang nun das erweiterte Projekt.
    Von Form2 aus wird die Klasse mit Infotext2() aufgerufen. Bisher klappt alles so wie gewollt.
    Dateien
    • TestDataset2.zip

      (366,75 kB, 162 mal heruntergeladen, zuletzt: )
    Ja, scheint auf den ersten Blick zu passen.
    Jetzt wäre noch ein weiterer Schritt möglich (aber nicht zwingend). Derzeit hast Du auch zur Designzeit leere DGVs. Wenn das in Deinem Sinn ist, dann ok. Ich binde meine DGVs gerne schon zur Designzeit an das DataSet. Dann sehe ich die Spalten schon, kann an denen rumbasteln und es mir schön einrichten. Dann weiß ich ungefähr, was während der Laufzeit auf mich zukommt. Das kannst Du auch, wenn Du willst: Wähle im Menü Ansicht -> weitere Fenster -> Datenquellen. Dort tauchen Deine tDS-Klasse und die DataTables auf. Du kannst jetzt z.B. die Wert-DataTable per Drag&Drop auf das DGV1 ziehen und damit verknüpfen. (Jetzt entsteht unten links bei den Komponenten neben DataSet1 eine WertBindingSource; auf die komme ich noch.) So siehst Du, welche Spalten die Wert-DT hat und welche angezeigt werden. Diese Anzeige kannst Du ändern (ID-Spalten raus, Breitenanpassung an die Inhalte, ...). Das macht die Sache um einiges komfortabler. Das gleiche machst Du in den anderen Formularen.
    Codetechnisch ändert sich aber dann was: Die Zuweisungen wie

    VB.NET-Quellcode

    1. Me.DataGridView1.DataSource = Me.DataSet1.Wert

    brauchst Du nicht mehr. DGV1 ist ja bereits über die BindingSource (jetzt kommt sie wieder) an das tDS verknüpft.
    Für die anderen Formulare heißt das aber: Auch dort verweisen die DGV-DataSources nicht mehr auf die tDS-DataTables, sondern die durch D&D neu entstandenen) BindingSources verweisen auf das tDS.
    D.h. aus

    VB.NET-Quellcode

    1. Public Sub New(_ds As DataSet1, _TestClass As TestClass)
    2. MyBase.New()
    3. Me.InitializeComponent()
    4. Me.ds = _ds ' Ist NUR ein Referenzübergabe an die Membervariable!!
    5. Me.DataGridView1.DataSource = Me.ds.Wert 'Soll nur zeigen was drin ist
    6. Me.DataGridView2.DataSource = Me.ds.NoiseSource 'Soll nur zeigen was drin ist
    7. ' ########################
    8. Me.TestClass_Form2 = _TestClass
    9. End Sub

    musst Du

    VB.NET-Quellcode

    1. Public Sub New(_ds As DataSet1, _TestClass As TestClass)
    2. MyBase.New()
    3. Me.InitializeComponent()
    4. Me.ds = _ds ' Ist NUR ein Referenzübergabe an die Membervariable!!
    5. Me.WertBindingSource.DataSource = Me.ds 'Soll nur zeigen was drin ist
    6. Me.NoiseSourceBindingSource.DataSource = Me.ds 'Soll nur zeigen was drin ist
    7. ' ########################
    8. Me.TestClass_Form2 = _TestClass
    9. End Sub

    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.
    Wenn man mit den DGV arbeiten will, ist das natürlich sehr hilfreich. Die DGVs sind in dem Testprojekt nur zur Veranschaulichung. In meinem aktuellen Projekt erfolgt die ganze Datenverarbeitung auf Codeebene und die Darstellung letztlich nur in einem Chart.

    Nochmals zum Verständnis zu Beitrag #21: Wenn ich also in einem stark untergeordneten Fenster (Fenster1 öffnet Fenster2, welches wieder ein Fenster3 öffnet, welches dann Fenster4 öffnet) auf das Dataset zugreifen möchte, muss ich bis zu diesem letzten Fenster das Dataset mit durchreichen - und für die Klasse, die das Dataset verwenden soll, gilt das dann auch. Ist das so richtig?

    Ich habe mal versucht den ersten Weg (der in Beitrag #20 verworfen wurde) mit der Anzeigeklasse "TestClass" anzuwenden. Das führt irgendwie zu einem Fehler im angehängten Projekt.
    Von Form1 soll das Form4 geöffnet werden. Von Form4 aus soll mit einem Button über die TestClass das Dataset abgefragt werden. Es sollen die Daten also nicht manipuliert werden, sondern nur abgefragt werden.
    Dateien
    • TestDataset2.zip

      (369,91 kB, 98 mal heruntergeladen, zuletzt: )

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

    Das wäre Weg 2, ja. Weg 4 hatte ich in dem anderen Thread erwähnt, aber hier noch nicht, da vergessen: der globale-Variable-Ersatz:
    Form1 übergibt sein tDS ganz zum Anfang an ein Modul. Dieses nimmt es entgegen und packt es in ein moduleigenes tDS-Objekt. Dieses moduleigene tDS-Objekt wird dann überall im Projekt verwendet, auch sonst in Form1 (außer eben in der Erstzuweisung):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. TdsHolder.Set(Me.DataSet1)
    4. End Sub
    5. End Class
    6. Friend Module TdsHolder
    7. Private _GlobalTds As DataSet1 = Nothing
    8. Friend Property GlobalTds As DataSet1
    9. Get
    10. Return _GlobalTds
    11. End Get
    12. Set(NewTds As DataSet1)
    13. If _GlobalTds Is Nothing Then _GlobalTds = NewTds
    14. End Set
    15. End Property
    16. End Module

    Jetzt kann von quasi überall her mit GlobalTds auf eben jenes zugegriffen werden, ohne dass ein tDS als Parameter bei der Unterform-Erstellung übergeben werden muss.
    Welcher jetzt da der beste der von mir erwähnten 4 Wege ist: Wie gesagt, probier es aus. Ich bin auch grad dabei, in meinen Projekten die verschiedenen Wege zu probieren.
    Aber: Vergiss die DBExtensions vom EdR nicht! Er beschäftigt sich seit Jahren damit und hat da (zweifelsfrei) schon einen effektiven Weg gefunden.
    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.
    Ich werde das mit deinem Modul mal ausprobieren. Module sind für mich neu.
    Gut dass du die DBExtensions vom EdR wieder ins Spiel bringst. Sollte EdR hier mitlesen würde ich ihn bitten hierzu etwas zu schreiben. Wo hat sein Weg Vorteile gegenüber den bisher gezeigten Wegen?

    Edit: Wenn ich den Code aus Beitrag #24 einfüge wird mir ein Fehler angezeit: " "Set" ist kein Member von "TdsHolder".
    Das Modul habe ich unter die Classe vom Form1 kopiert.

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

    Set ist ja ein Teil der Property (Zeile#9). Dieses Set wird im Formularcode nicht direkt aufgerufen, sondern mit GlobalTds = Me.DataSet1. Das ist das Besondere an Properties. Werden beim Coden wie eine normale Variable verwendet, es läuft aber mehr im Hintergrund ab. Propertys sind Dir bekannt?
    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.
    Wie bereits erwähnt: Deine Screenshotzeile#32 ist falsch. Da kommt rein: GlobalTds = Me.DataSet1
    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.
    Im Anhang findet ihr nun meine Zusammenfassung. Ohne die Hilfe von euch hätte ich das nicht geschafft. Letztlich bin ich von der Arbeiten mit dem Modul und der Verteilung des Datasets als "GlobalTds" aus Post #24 begeistert. Damit lassen sich alle meine "Probleme" lösen. Daher liegt der Schwerpunkt in dem hier angehängten Testprojekt auch auf dieser Herangehensweise. Auch wenn einige eurer Beispiele, wie das Durchreichen von Klassen oder dem Dataset in eine untergeordnete Klasse scheinbar nicht mehr auftauchen, haben sie mir sehr geholfen. So sind auch gleich andere große Fragen die ich noch hatte gleich mit beantwortet worden.

    Was ist jetzt noch mir den DBExtensions vom EdR? Können sie mir bei meinem jetzigen Wissensstand noch weiterhelfen oder sollte ich jetzt erst einmal den Umgang mit GlobalTds in meinem Hauptprojekt üben?
    Dateien
    • TestDataset2.zip

      (371,31 kB, 160 mal heruntergeladen, zuletzt: )

    VB.NET-Quellcode

    1. Private Sub LoadTestClass() 'LoadTestClass() wird gleich vom Konstruktor aus ausgeführt
    2. TestClass = New TestClass_neu
    3. For i As Integer = 0 To 2 - 1
    4. SetDataIntoDataset()
    5. Next
    6. Me.DataGridView1.DataSource = GlobalTds.Wert 'Soll nur zeigen was drin ist
    7. Me.DataGridView2.DataSource = GlobalTds.NoiseSource 'Soll nur zeigen was drin ist
    8. End Sub

    Zeile#3 kapier ich nicht. Die For-Schleife an sich auch nicht.

    Mein Vorschlag: Probier erstmal ein paar Tage das so, wie Du es hast. Dann schau Dir z.B. dieses Video und später noch den Thread zu den DBExtensions an, dann entscheide selbst.
    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.