DataSet / DataBindingSource (mehrere DataGridViews)

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

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

    DataSet / DataBindingSource (mehrere DataGridViews)

    Hallo zusammen,

    ich arbeite schon seit etwas längerem mit DataSet / DataBinding, habe dahingehend allerdings ein Verständnisproblem.

    Ich habe derzeit über ein TabConrol in drei Taps jeweils eine DataGridView, sprich drei Insgesamt.
    Mit dem erstellen und Verbinden über eine MySql Datenbank habe ich hierbei als Datenquelle ein DataSet angelegt und dieses auch in der Form angezeigt bzw. angebunden.
    Soweit alles ok. Daten speichern/löschen/ändern, alles kein Problem.

    Nun wollte ich ganz gerne aus dem einen DataSet bzw. von den hinterlegten Filtern im TableAdapter die drei unterschiedlichen DataGridViews füllen lassen.

    Sprich im DataGridView1, sollen alle Einträge angezeigt werden aus der Tabelle "Test" wo "gespeert='1'" ist.
    In der DataGridView2, sollen alle Einträge der Tablle "Test" angezeigt werden, wo "offline='1'" ist.

    In einer DataGridView bekomme ich das ohne Probleme hin, nur wie kann ich die zweite DataGridView mit den selben werten darstellen lassen wo offline = 1 ist.

    Hintergrund: Wenn ich bei gespeert auf einen Benutzer klicke, soll ich diesen ändern können in den dafür vorgesehenen TextBoxen.
    Wenn ich bei der zweiten DataGridView auf den Benutzer klicke dieser "offline" ist, so möchte ich ebenfalls dessen Daten in den gleichen TextBoxen angezeigt bekommen um diese ändern zu können.

    Ich hoffe ich konnte es verständlich rüber bringen, über Hilfe wäre ich sehr dankbar.

    Gruß

    Spike
    Deine Begriffe sind bischen durcheinander.
    ZB ein TableAdapter hat keine hinterlegten Filter - was meinst du damit?
    Auch füllt ein TableAdapter kein Datagridview.

    Was du beschreibst, was du erreichen möchtest, könnte man lösen, indem man die DGVs an verschiedene BindingSources anschliesst.
    Und etwa bei BindingSource1.Filter "gesperrt=1" eintragen, bei BindingSource2 hingegen "gesperrt=0" - oder "offline=1" oder whatever.

    Das mittm Hintergrund habich nicht wirklich verstanden.
    Bist du eiglich sicher, überhaupt 2 DGVs zu brauchen? Weil man könnte auch dasselbe nehmen, und seinen BindingSource-Filter mal so mal so setzen.
    @ErfinderDesRades

    Vielen Dank schon einmal für deine Antwort, ich habe mir deine Tutos auf Youtube sowie auch Beiträge wirklich mehrfach durchgelesen, auch deine bereitgestellten Projekte habe ich hierbei einmal durchstöbert. Erst einmal Top Arbeit und vielen Dank.

    ErfinderDesRades schrieb:


    ZB ein TableAdapter hat keine hinterlegten Filter - was meinst du damit?
    Auch füllt ein TableAdapter kein Datagridview.

    Das stimmt, schuldige hierfür, ich komme damit noch ab und zu durcheinander bzw. ich weiß was der TableAdapter hierbei natürlich macht, aber manchmal steht es etwas unglücklich da. Auch das dies kein DataGridView beschreibt ist klar, sondern eher zum Austausch dienst.
    Anbein ein Bild, wahrscheinlich aus diesem Grund etwas unglücklich verfasst.

    Ich habe hierbei zwei Abfragen generiert über den Generator, soweit sogut. die stehen auch drinne und funktionieren soweit, sofern ich diese einzeln aufrufe.
    FillDispo, filtert nach offline ='1' und FillGespeert, filtert nach den gespeert='1'.

    ErfinderDesRades schrieb:


    Was du beschreibst, was du erreichen möchtest, könnte man lösen, indem man die DGVs an verschiedene BindingSources anschliesst.
    Und etwa bei BindingSource1.Filter "gesperrt=1" eintragen, bei BindingSource2 hingegen "gesperrt=0" - oder "offline=1" oder whatever.

    Korrekt, so bin ich auch vorgegangen, ich habe zwei BindingSource, eine mit dem Entwurf-Namen:"BindingSourceDispo" / DataSource:"resDataSet" und eines mit dem Entwurf-Namen:"BindingSourcegespeert" / DataSource:"resDataSet". Beide haben natürlich als DataMember hier den Tabellennamen:"einsatz" derzeit.


    ErfinderDesRades schrieb:


    Bist du eiglich sicher, überhaupt 2 DGVs zu brauchen? Weil man könnte auch dasselbe nehmen, und seinen BindingSource-Filter mal so mal so setzen.

    Der Gedankengang hatte mich die ganze Zeit auch begleitet, doch währe es zwecks der Übersicht natürlich schön gleich beide DataGridView's gezeigt zu bekommen auf der Startseite.

    Getestet habe ich folgendes im Code bzw. im Form_Load (nur als Test):

    VB.NET-Quellcode

    1. Me.EinsatzTableAdapter.FillGespeert(Me.ResDataSet.einsatz)
    2. Me.EinsatzTableAdapter.FillDispo(Me.ResDataSet.einsatz)

    Wenn ich dies so durchführe, zeigt er natürlich nur in der DataGridView das an was zuletzte im Form_Load stand, sprich die Sortierung nach "Offline" / Dispo.

    Weiterhin hatte ich folgendes versucht:

    VB.NET-Quellcode

    1. BindingSourcegespeert.DataSource = Me.EinsatzTableAdapter.FillGespeert(Me.ResDataSet.einsatz)
    2. BindingSourceDispo.DataSource = Me.EinsatzTableAdapter.FillDispo(Me.ResDataSet.einsatz)
    3. DGW_gespeert.DataSource = BindingSourcegespeert
    4. DGW_disponiert.DataSource = BindingSourceDispo

    Hier zeigt er mir keinerlei Ergebnisse an, da mir derzeit unklar ist, wie ich vorher die jeweilige DGW vorher befüllen lasse durch meine Filter.

    NACHTRAG:
    Ich habe noch einmal ein bisschen recherchiert und habe nun folgendes umgesetzt, womit es so wie gewollt funktioniert.

    Im Form_Load habe ich folgendes stehen:

    VB.NET-Quellcode

    1. Me.EinsatzTableAdapter.Fill(Me.ResDataSet.einsatz)

    Quasi mit SELECT * FROM Tabelle ...

    In den jeweiligen BindingSource: "BindingSourceDispo / BindingSourcegespeert" habe ich den Filter gesetzt auf "gespeert='1' bzw. offline='1'"
    Damit hat es soweit funktioniert beide DataGridViews werden mit den jeweiligen ausgewählten BindinSource gefüllt und zusätzlich automatisch gefiltern auf den gewünschten Wert.

    Ist das so korrekt, oder gibt es schönere Lösungen, abgesehen von den Namensgebungen und Co. die sind wirklich einfach nur zum Testen.

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

    ich glaub, bevor ein TableAdapter eine DataTable befüllt, löscht er sie.
    Mit zwei TableAdaptern also dieselbe DataTable befüllen zu wollen bringt also nix.
    Wie gesagt: befüll deine DataTable mit allen Datensätzen, die du sehen möchtest, und mach die Filterung auf eine Auswahl daraus dann inne BindingSource.
    Danke dir, das hat soweit funktioniert.
    Jetzt stehe ich nur gerade noch vor einer schwierigkeit - für mich zumindest.

    Ich habe im oberen Teil überall Textboxen für die spalten innerhalb der Tablle diese ich auch gerne ändern möchte.
    Wie bekomme ich es allerdings nun hin das die Textboxen von der richtigigen BindingSource aus gefüllt werden bei Klick.

    Sprich, ich kann wenn ich eine TextBox anklicke, dieser im Bereich "Daten" -> "DataBindings" -> "Text" den Wert zuweisen von der BindingSourceDispo, sprich "id".
    Das klappt auch soweit, nun wenn ich allerdings in die andere Tabelle klicke "gespeert" dann ändert sich der Wert der TextBox natürlich nicht, da dieser nur mit der BindingsSourceDispo - id verknüpft ist, so in meinem Verständnis.

    So hätte ich dies ungefähr gemacht, jeh nachdem in welche DGW man etwas selektiert:

    VB.NET-Quellcode

    1. txt_box_einsatz_id.DataBindings.Add("Text", BindingSourceDisponiert, "id")


    Wie kann ich dies bei einem change besser lösen?

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

    Wie gesagt: Mit nur einem DGV, und nur einer BindingSource - deren Filter allerdings gewechselt wird - wäre das kein Thema.

    Ansonsten musste nun halt codeseitig alle Textbox-Bindings umstöpseln, oder du verwendest für die Textboxen eine zwischen-BindingSource, die mal an die eine mal an die annere DGV-BS angeschlossen wird.

    Also 3 Ansätze:
    1. nur 1 DGV
    2. codeseitige Umstöpselei (hierfür gugge, wie im DesignerCode die Bindings konfiguriert sind)
    3. umschaltbare Zwischen-BS (hierfür die bestehende im Designer kopieren. Dann die bisherige an die (neue) Kopie anschliessen - und dann vonne bisherigen den DataMember löschen. (naja, schwer zu erklären))
    Danke für deine Tipps,

    ich habe es nun so gelöst das ich bei dem TabSelectIndexChange jeweils die andere BindingSource überge zum laden der Daten in die textboxen.
    Klappt hierbei super, wenn es auch eher ein Workaround ist als wahrscheinlich die dafür passende Lösung.

    Da du bei meinem letzten Posts einmal das Logging angesprochen hast, darf ich hierbei fragen welche Tipps und Möglichkeiten hierbei die sinvollsten wäre.
    Ziel von mir ist es ein Live Logging hin zu bekommen, sprich bei dem aufrufen oder Fehlern in einem Try Catch diese zum einen in eine .log zu packen und zum anderen in einer Form als laufendes Log Event mir ansehen kann.

    Oder soll ich hierfür ein seperates Thema öffnen?