Dateilview Fehler Combobox Beziehungen

  • C#

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

    Dateilview Fehler Combobox Beziehungen

    Hallo,

    Ich habe ein Problem mit dem Editieren von Datensätzen in einem Detailview.
    Aus einer Access-Datenbank habe ich ein Dataset generiert und dann von einigen Tabellen ein Datagridview sowie die Detail-Felder auf eine Form gezogen.
    Für jede Tabelle hab ist jeweils ein Tab.

    Wenn ich im Tab Firma bei einem Firma-Datensatz (Detailview) eine hauptkontaktID (Kontaktname) aus der Combo auswählen oder ändern will wird automatisch der Firma-Datensatz den ich verändern will geändert, also ein anderer ist angewählt bzw aktiv.

    Firma:
    firmaID (PK)
    hauptkontaktID (FK Tab: Kontakte)
    name
    haupttelefon
    hauptfax
    beschreibung
    notiz
    etc

    Kontakte:
    kontaktID (PK)
    kontaktart(FK)
    nachname
    vorname
    firmaID(FK Tab: Kontakte)
    etc


    Die hauptkontaktID - Combobox hat folgende Eigenschaften.


    Das Problem tritt auch in anderen Tabellen auf.
    Kann es sein das es ein Problem ist, dass die Tabellen 2 Beziehungen zueinander haben ? Oder was könnte das Problem sein ?

    Danke für eure Antworten

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

    outlop schrieb:

    eine hauptkontaktID (Kontaktname) aus der Combo auswählen oder ändern will wird automatisch der Firma-Datensatz den ich verändern will geändert, also ein anderer ist angewählt bzw aktiv.
    Du musst der Combo eine eigene BindingSource gönnen.
    Wenn du sie an eine BindingSource hängst, die auch von anderen Controls genutzt wird (etwa von Datagridview), dann synchronisieren sich diese beiden Controls.
    Das kann auch erwünscht sein, scheint in diesem Fall aber nicht so.
    Kennst du vier Views-Videos?
    Da wird das alles vorgeturnt.

    ErfinderDesRades schrieb:

    Du musst der Combo eine eigene BindingSource gönnen.
    Wenn du sie an eine BindingSource hängst, die auch von anderen Controls genutzt wird (etwa von Datagridview), dann synchronisieren sich diese beiden Controls.
    Das kann auch erwünscht sein, scheint in diesem Fall aber nicht so.
    Kennst du vier Views-Videos?
    Da wird das alles vorgeturnt.


    Also einfach bei der Combobox, Eigenschaft Datasource - Weitere Datenquellen - MeinDataset - Kontakt
    Damit eine neu Bindingsource - kontaktBindingSource1 erstellt wird ?

    Ja hab die Videos angeschaut.

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

    Hallo ErfinderDesRades,

    ja, ich habe alle Deine Videos schon mehrfach angeschaut, nur falls die Frage auch kommt.
    Ich weiß, dass ich für jede Combobox in einem DataGridView eine eigene Bindingsource brauche, sonst haben wir den o.g. Seiteneffekt.
    Jetzt habe ich ein Form mit mehreren TabPages in einem TabControl und auf diesen einige DataGridViews, in vielen davon Comboboxen auf ein paar Stammtabellen. Das hat eine Inflation u.a. von Bindingsources zur Folge. Das liegt wohl in der Absicht von Microsoft - oder?

    Wenn ich jetzt in irgendeinem Bindingsource aber etwas an der Sortierung o.ä. ändern möchte, dann finde ich das Ding kaum noch - weder die Dokumentendarstellung noch dieser Bereich, in dem alle automatisch erzeugten Form-Elemente reinplaziert werden sind so übersichtlich, dass man das was findet, wenn man mal mehr als 20 TableAdapter, BindingSources, DataSets, TableAdapterManager dort hat.
    Gibt es da eine einfache Möglichkeit, zu Suchen, Sortieren o.ä.?

    Danke!
    Ja, das wird iwann problematisch.

    Die erste Massnahme ist eine durchdachte Benamung: kurze, eindeutige Namen, die aussagen, welche Tabelle oder welche Relation von einer BindingSource bereitgestellt wird.

    Das nächste ist Code-Aufteilung insgesamt: Oft bietet sich an, Funktionsbereiche in UserControls auszulagern, sodass man am Ende zB ein TabControl hat, wo auf jeder TabPage nur ein einziges Control drauf ist - nämlich ein UserControl, in dem sich alles weiter abspielt.

    Aber dabei gibts einiges zu beachten, denn die Kommunikation des Forms mit den UserControls ist eine Variante formübergreifenden Databindings. Also entweder du denkst dir da selbst was kluges für aus, oder du übernimmst meine Helper-Dlls, die haben eine Register-Methode, die sich um sowas kümmert.
    Die schlankeste Version meiner Helpers habich übrigens neulich auf Codeproject veröffentlicht - im Rahmen eines Tuts, was hofflich auch die Hintergründe davon klärt: codeproject.com/Articles/10351…ped-Dataset-for-Beginners
    Danke für die Antwort. Habe eben mal den Link aufgemacht - dazu muss ich mir mal nen Tag Urlaub nehmen ;) Werde ich mir aber durchlesen!

    Dann bin ich eben per Zufall auf das gekommen, was ich gesucht und hier gefragt habe:

    Ist man im Formdesigner in der unteren Hälfte, wo die ganzen TableAdapter etc. rumliegen, kann man ja einen anklicken und sieht dann im Eigenschaften-Fenster eine Hand voll Eigenschaften. Und dieses Fenster hat oben eine Combobox, in der alle Controls - also auch die BindingSources, TableAdapter, DataSets... drin sind. Hat man die sinnvoll benannt (mit dem Objekt-Typ am Anfang, z.B. BindingSourceArtikeltypFürArtikel) dann findet man das Ding ganz schnell.

    Blöd ist, wenn ich in einem DataGridView bin und mehrere Textfelder zu ComboBoxen ändere und damit jedes Mal eine neue BindingSource erzeugen lasse, dann wird die leider standardmäßig z.B. ArtikeltypBindingSource5 benannt (und dort kann man das ja nicht ändern), dann muss ich die erst mal wieder wie o.g. aufrufen und umbenennen...
    Und das am besten gleich, wenn ich erst mal ArtikeltypBindingSource1-10 habe, weiß ich doch nicht mehr, wo ich welche genutzt habe und kann sie auch nicht sinnvoll benennen, ohne immer nachzuschauen.
    Kommt halt immer drauf an, und v.a. muss man wissen, was man tut.
    Ich hab zB nur selten mehr als 2 ComboboxColumns in einem DGV.

    Und wenn ich mehrere davon habe, und die holen alle ihre Werte aus derselben Tabelle, dann können die durchaus an einer gemeinsamen BindingSource zusammengeschaltet werden.
    Etwa im verlinkten Sample im FormMain-OrderEntries-DGV sind 2 ComboColumns an dieselbe BindingSource gehängt, denn sie zeigen von derselben ParentRow (halt verschiedene) Spalten an (unterschiedliche DisplayMember).
    Angenommen, ich habe 2 fachlich und technisch nicht zusammenhängende DGVs, beide haben eine Comboboxspalte auf die Tabelle Artikeltyp.
    Wenn ich jetzt beide Comboboxen an die selbe BindingSource binde, und wähle in einer einen Typ aus, dann ändert sich doch in der anderen der Typ auch, da der aktuelle Datensatz in der Tabelle, auf den die Bindingsource verweist, sich geändert hat - korrekt?
    Dann machten mehrere Comboboxen, die an die selbe BindingSource gebunden sind, in einem DGV nur dann sinn, wenn - wie Du oben geschrieben hast - diese verschiedene DisplayMember ein und des selben Datensatzes anzeigen.
    In allen anderen Fällen führt das vermutlich meistens zu ungewünschten Datenänderungen, oder?
    ja, genau.

    Obwohl - wenn es wirklich ComboboxColumns sind, dann wird da nur während des Editierens eine Combobox generiert, die nachher wieder verworfen wird. Also 2 ComboColumns, in verschiedenen Grids können doch an dieselbe BindingSource gehängt werden.

    Aber wirklich nur ComboboxColumns - keine Comboboxen, Listboxen oder DatagridViews dürfen da mit drangehängt werden

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