Korrekten Datensatz in Bindingsource anwählen c#

  • C#

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

    Korrekten Datensatz in Bindingsource anwählen c#

    Hallo,

    ich habe ein Dataset mit zwei Tabellen: Stunden + Mitarbeiter
    In der Tabelle Stunden sind die Stunden der Mitarbeiter gespeichert, refernziert über eine MitarbeiterID zur ID der Mitarbeiter Tabelle.

    Das ganze ist als XML Datei gespeichert.
    Mit einem dataSet.ReadXml(XMLData.FullName) wird das ganze eingelesen.
    In einem Datagrid lasse ich mir den Inhalt von Tabelle Stunden anzeigen.
    Mit einem JoiningView lasse ich mir dabei auch die Klarnamen der Mitarbeiter im Datagrid anzeigen.

    Dies funktioniert alles korrekt.

    Wenn ich aber nun eine Combobox in das Form ziehe und bei dieser als Datenquelle die Bindingsource der Mitarbeiter angebe, als ausgewählten Wert aber die MitarbeiterID aus der Stunden-Bindingsource
    wird nach dem Laden der Daten in dem Datagrid alles korrekt angezeigt, der Datensatzzeiger steht dort auf dem ersten Datensatz.

    In der Combobox wird aber der Mitarbeiter aus dem ersten Datensatz der Mitarbeiter-Bindingsource angezeigt, nicht der Mitarbeiter der im ersten Datensatz der Stunden-Bindingsource steht.
    Warum?

    Wenn ich nun im Datagrid zum nächsten Datensatz wechsel wird auch noch der Mitarbeiter mit dem Wert aus der Combobox (dem ersten Mitarbeiter aus der Mitarbeiter-Bindingsource) überschrieben.
    Wer kann mir helfen?
    Die Combobox muss eine vom DGV unabhängige eigene BindingSource bekommen - nicht dieselbe BS nehmen, die schon die ComboboxColumn des DGVs versorgt.
    Sonst sind ComboboxColumn und Combobox miteinander verbunden, was auf Seiten der ComboboxColumn nix macht, aber bei der Combobox Verwirrung stiftet.
    na, dann musst du nochmal genau in vier Views-Videos den entsprechenden Film angugge - DataSource muss eigenständig sein, aber cbo.SelectedValue muss in die BindingSource des Dgvs schreiben.

    Lad dir am besten das Sample und guck, welches Form das gewünschte umsetzt (glaub DetailView), und gugge entsprechenden Film
    Genau daran hatte ich mich ja orientiert.
    Die Combobox innerhalb des DGV funktioniert auch wunderbar.
    Ich habe jetzt aber nur eine Combobox zusätzlich auf das Form gezogen.
    Datenquelle ist eine eigene BS. Wenn ich bei "ausgewählter Wert" auf das Feld der BS vom DGV verweise kommen die Probleme.
    Lasse ich dieses Feld frei funktioniert alles. Das DGV zeigt die Daten an und in der separaten Combobox kann ich meine Mitarbeiter auswählen.
    Ich hätte es aber ganz gerne das in der Combobox automatisch der Mitarbeiter angewählt wird der dem Mitarbeiter im angewählten Datensatz des DGV entspricht. Dazu hatte ich ja bei "ausgewählter Wert" auf die BS vom DGV verwiesen.
    Wenn ich das tue, wird aber nach dem Laden des DS der erste Datensatz im DGV geändert wenn ich den Datensatz im DGV verlasse.
    Bewege ich mich danach im DGV funktioniert alles wie es soll. Beim jeden wechsel des Datensatz im DGV wird die Combobox richtig aktualisiert.
    noch einmal: such den richtigen Film aus, und guck den. Und guck die Solution ganz genau an - einzelne Comboboxen sind besonders sorgfältig zu binden, und kann man auch nicht mit dem Datenfenster arbeiten, denn der Designer bindet die Combo.Text-Property, und die darf nicht gebunden sein - überprüf das auch mal.

    ComboboxColumn und Combobox ist ein riesen-Unterschied.
    Zu beiden ist in den Filmen gezeigt, wie mit umgehen.
    Und es funktioniert dann auch so, wie du es erwartest.
    Ich weiss, es ist schwer zu glauben. Aber ich habe es genau so gemacht.
    Bin (nochmal) die Filme schritt für schritt durchgegangen und wie in vier Views(IV) - DetailView dargestellt die Combobox in das Formular gebaut.
    Alle Einstellungen nochmal überprüft, stimmt exakt mit deinen Einstellungen überein.

    Ich vermute das Problem liegt beim laden der Daten.
    Nach dem Programmstart sind meine Tabellen leer.
    Mit einem Button werden dann folgende Befehle ausgeführt:

    dataSetPraxisDB.clear()
    dataSetPraxisDB.ReadXml(PraxisStdXMLData.FullName)

    werden die Daten dann geladen.
    Im DGV werden dann alle Daten korrekt angezeigt, aber in der Combobox steht der erste Datensatz der Mitarbeitertabelle.
    Wenn ich nun im DGV den Datensatz verlasse wird der Wert aus der Combobox übernommen und überschreibt den Wert im DGV.
    Aber nur EINMAL zum Anfang.
    Bewege ich mich nun im DGV weiter läuft alles wie in deinem Film auch beschrieben.
    Wähle ich im DGV einen Datensatz aus, wird in der Combobox der korrekte Mitarbeiter angezeigt.
    Wähle ich in der Combobox einen anderen Mitarbeiter aus, wird dieser im DGV übernommen, genauso wie es sein soll.
    Nur eben nicht beim ersten mal nach dem Laden der Daten.
    komisch. entweder doch was falsch gemacht, oder eine unglückliche Konstellation der Reihenfolge der Befüllung.

    In meinen Extensions zur Befüllung von Datasets deaktiviere ich alle Events aller DataTables und BindingSources, solange ein Dataset eingelesen wird.
    Das bringt bei vielen Daten enorm Performance, und vermeidet auch so ungünstige Konstellationen.
    Probierma .RaiseListChangedEvents = False zu setzen erst für alle Mitarbeiter-BindingSources, dann für alle den Mitarbeitern untergeordnete BindingSources.

    Oder zipp die Sources und hängs mal an.
    thx für die Mail aber die Dateianhang-Funktion ist doch einfacher? Video-Anleitung zur Forum-Bedienung

    Ansonsten wie ich sagte: Wenn man die BindingSources während des Ladens deaktiviert, dann flutschtes:

    C#-Quellcode

    1. private FileInfo PraxisStdXMLData = new FileInfo("PraxisSTdXMLData.xml");
    2. private BindingSource[] _BindingSources;
    3. public frmZeiterfassung() {
    4. InitializeComponent();
    5. _BindingSources = new BindingSource[] { tblMitarbeiterBindingSource, tblStundenBindingSource };
    6. }
    7. private void btnLaden_Click(object sender, EventArgs e) {
    8. foreach (var bs in _BindingSources) { bs.RaiseListChangedEvents = false; }
    9. dataSetPraxisDB.Clear();
    10. if (PraxisStdXMLData.Exists) {
    11. dataSetPraxisDB.ReadXml(PraxisStdXMLData.FullName);
    12. }
    13. foreach (var bs in _BindingSources) {
    14. bs.RaiseListChangedEvents = true;
    15. bs.ResetBindings(false);
    16. }
    17. }

    Meine Helpers-Extensions sind dir doch bekannt, oder?
    Lad dir "Vb10Projects" von Daten laden und speichern, und binde die Helpers bei dir ein.
    Dann hast du eine Dataset.Fill() - Methode und solche Tücken sind Geschichte.

    Übrigens - ein Prefix für Tabellen ist im Dataset sinnlos, denn es kann eh nix anneres hinein als Tabellen.
    Und siehst ja, dass auch die BindingSource-Namen nun diesen bescheuerten Prefix haben - der da nu wirklich nicht hingehört.

    guck auch mal in den Download, wie ich die Daten-Datei eingebunden habe.
    Und hab jetzt auch festgestellt: Es liegt tatsächlich daran, in welcher Reihenfolge die Datensätze in der Datendatei vorliegen: Pack die Mitarbeiter-Datensätze nach vorn, und der Fehler ist auch weg.

    ach nochwas hierzu:

    C#-Quellcode

    1. if (PraxisStdXMLData.Exists) {
    sollte weg.
    Die Anwendung soll abstürzen, wenn die Datendatei nicht da ist.
    Stattdessen wird nu blos das Dataset geleert, unnützes Zeugs mitte BindingSources angestellt und User guckt in die Röhre und erfährt nichtmal, dass ein Fehler aufgetreten ist.
    Dateien

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

    1. sehr komisch - wie gesagt: grade probiert, und flutscht wies soll
    2. tja - Klassen importieren kann nur VB :P
      Es muss halt mal auch was geben, wo VB besser ist als c# ;)
      Also es ist auch in vb nicht unabdingbar notwendig, aber du siehst ja, wie unförmig der typisierte Daten-Zugriff in c# ist:

      C#-Quellcode

      1. DataSetPraxisDB.tblStundenRow rwTblStunden = (DataSetPraxisDB.tblStundenRow)((DataRowView)(tblStundenBindingSource.Current)).Row;
      Das treibt eim schon die Tränen inne Augen, odr?



    Übrigens zur "Macht der Gewohnheit": ganz schlechtes Konzept - ein anderes Wort dafür wäre: "LernResistenz" :thumbdown:

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