Probleme bei n:n Beziehung

  • VB.NET

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

    ich find das normal mit viele BindingSources. Ich bename die kürzer, und wenn nicht klar ist, wer daran bindet, kommt auch diese Info in den Namen rein.
    Aber hier ist glaub eindeutelich, dasses die Bs' der Combos sind.

    Mich stört, dass schön typisierte Datarows aus den BindingSources geholt werden, und dann wird nicht konsequent damit gearbeitet

    VB.NET-Quellcode

    1. Private Sub K_FaktorBindingSource_Add(sender As Object, e As AddingNewEventArgs) Handles bsK_Faktor.AddingNew
    2. ' kein TryCatch
    3. Dim rwZelle = DirectCast(DirectCast(bsZelle.Current, DataRowView).Row, ZelleRow)
    4. Dim rwStation = DirectCast(DirectCast(bsStation.Current, DataRowView).Row, StationenRow)
    5. Dim rwKF = DirectCast(DirectCast(e.NewObject, DataRowView).Row, K_FaktorRow)
    6. rwKF.ZelleRow = rwZelle
    7. rwKF.StationRow = rwStation
    8. End Sub
    Und mit Importen lassen sich viele Namens-Bandwürmer vermeiden

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports MyRootNamespace.Standard
    wenn Standard der Name deines typDatasets ist (was nicht wirklich ein guter Name wäre)

    Vlt ziehste dir mal codeproject.com/Articles/10351…ped-Dataset-for-Beginners
    ganz genau rein - da wird u.a. systematisch dargestellt, welche Properties, Functions, Events typDataset, typDataRow, typDataTable generiert bekomment, und auch die ObjectBrowser-Bedienung, wie man diese selbst inspizieren kann.
    Diese Member kann man halt nicht ergoogeln, deswegen ObjectBrowser.



    Aber das hier verstehe ich nicht

    ludl8615 schrieb:

    ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    wieso bsStation, bsZelle extra erstellen, um aufs bsKFaktor-AddingNew zu reagieren?
    Ich denk, das sind die BindingSources, an dene deine beiden Combos hängen?
    Also da könnte man sagen, die sind extra für die Combos erstellt, ja.

    So ist das eben: die BindingSources steuern den Datenfluss. Sollen 2 Controls in verschiedenen Flüssen schwimmen, braucht jedes seine eigene BindingSource.

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

    ErfinderDesRades schrieb:

    ich find das normal mit viele BindingSources. Ich bename die kürzer, und wenn nicht klar ist, wer daran bindet, kommt auch diese Info in den Namen rein.
    Klar, hab ich auch häufiger. Wenn man auf nem Form eben viele Tabellenverweise braucht, dann ist es eben so. Selbst bei meinem privaten Kassenbuch habe ich über ein Dutzend BSs. Ist nur die Frage, ob der TE die Übersicht noch hat. Denn

    ErfinderDesRades schrieb:

    hier ist glaub eindeutelich, dasses die Bs' der Combos sind.
    stell ich nicht infrage. Nur eben, was sich konkret dahinter verbirgt. Denn wenn es mehrere Stationen-BSs und Zellen-BSs gibt, dann werden die ggf. alle etwas unterschiedlich eingestellt sein. Und da könnte das Wolf verbuddelt sein. Deshalb eben meine Frage nach den Property-Fenstern der BindingSources und die Kurz-Anleitung zur Fehlerfindung.
    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.
    "Guten "Morgen".

    VaporiZed schrieb:

    Ist nur die Frage, ob der TE die Übersicht noch hat

    Also ich kann definitiv sagen, den Überblick hab ich noch. Diese Form ist (wie der Name schon sagt) für alle Grundeinstellungen, sowie für den Dateneingang zuständig. Also auf anderen Tabs werden Stationen, Zellen, Personen, Gewichte... angelegt und zugeordnet, dafür all die anderen BS. Ich sollte mir auch mal angewöhnen die BS abzukürzen. StationenBindinSource1 und ZelleBindinSource1 habe ich noch nicht umbenannt da ich noch am probieren bin und in DIESEM Fall der Aufwand ja sehr gering ist (Bequemlichkeit => für den Fall das es so nicht funzt).
    Keine BS ist doppelt belegt. Bspw ZelleBindinSource ist zum Anlegen und verknüpfen der Zellen. Über die ZelleBindingfurKopieren können Datensätze kopiert werden, wenn neue Daten sich mit bereits vorhandenen ähneln. Nur zur Info: Stationen sind momentan 6 Messstände an einer großen Messeinrichtung, Zellen werden in eine Station eingebaut...).
    Aber ja, Ich mach mir irgendwann garantiert noch die Mühe und benenne das ganze nach und nach um (je nach Aufwand Nutzen...). ;) :)

    Nun wieder zum Thema:
    StationenBindinSource1 und ZelleBindinSource1 habe ich gestern extra für die Comobos angelegt, und KFaktorBindingSource wird an keiner anderen Stelle verwendet. Deshalb kann ich die Reaktion der CBs überhaupt nicht nachvollziehen.

    ErfinderDesRades schrieb:

    Mich stört, dass schön typisierte Datarows aus den BindingSources geholt werden, und dann wird nicht konsequent damit gearbeitet

    Stimmt! ich kann ja auch die ganze Row übernehmen, die IDs werden ja mit übernommen... Einzige Erklärung => es war spät und ich hatte ein Gläschen GinTonic (nicht förderlich) ^^ .

    ErfinderDesRades schrieb:

    Und mit Importen lassen sich viele Namens-Bandwürmer vermeiden

    Hatte ich schon mal, hatte aber zwischenzeitig zu einer Sicherung gewechselt, in der die Zeile noch nicht vorhanden war. Und dann kann die Bequemlichkeit in der Testphase.. ;)

    Also, ich hab jetzt mal alles umgesetzt/abgeändert und es funktioniert soweit, aber....

    VB.NET-Quellcode

    1. '#################################
    2. '# K_Faktor Add
    3. '#################################
    4. Private Sub K_FaktorBindingSource_Add(sender As Object, e As ComponentModel.AddingNewEventArgs) Handles K_FaktorBindingSource.AddingNew
    5. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    6. Dim ZelleRw = DirectCast(DirectCast(ZelleBindingSource1.Current, DataRowView).Row, Standard.ZelleRow)
    7. Dim StationRw = DirectCast(DirectCast(StationenBindingSource1.Current, DataRowView).Row, Standard.StationenRow)
    8. Dim rwKF = DirectCast(DirectCast(e.NewObject, DataRowView).Row, Standard.K_FaktorRow)
    9. rwKF.ZelleRow = ZelleRw
    10. rwKF.StationenRow = StationRw
    11. End Sub
    12. '#################################
    13. '# K_Faktor Sortieren
    14. '#################################
    15. Private Sub Stat_Zell_BS_CurrentChanged(sender As Object, e As EventArgs) Handles StationenBindingSource1.CurrentChanged, ZelleBindingSource1.CurrentChanged
    16. If StationenBindingSource1.Current Is Nothing Or ZelleBindingSource1.Current Is Nothing Then Exit Sub
    17. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    18. Dim CurrentZelleRow = DirectCast(DirectCast(ZelleBindingSource1.Current, DataRowView).Row, Standard.ZelleRow)
    19. Dim CurrentStationRow = DirectCast(DirectCast(StationenBindingSource1.Current, DataRowView).Row, Standard.StationenRow)
    20. K_FaktorBindingSource.FilterX("ZelleID = ? AND StationsID = ?", CurrentZelleRow.ID, CurrentStationRow.ID)
    21. End Sub

    es bleibt weiterhin bei dem merkwürdigen verhalten der CBs!!!

    Ich werde mich morgen Abend nochmal damit beschäftigen. Jetzt muss ich erstmal auf eine Pinkel-Party 8o .

    Vielen Dank an euch Beide!!!!!! :thumbsup:

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

    Jo, hab mir Vid angeguckt - das Form ist jetzt ja doch enorm vollgeballert mit BindingSources.
    Und das verrückte Verhalten der Combos kann ich mir nur erklären dadurch, dass noch annere Sachen an deren BindingSource hängen, etwa iwelche DatagridviewComboboxColumns.
    Oder wird iwo händisch was eingefüllt in die Combo, oder zugewiesen an Combo.Text.
    Weil 0 dürfte eine Combo garnet anzeigen können, deren DataMember auf Name festgelegt ist.

    Mir scheint hier auch zweckmäßig, mit UserControls zu arbeiten, pro Tab eines.
    Das verkompliziert die Databinderei aber, weil dann muss man formübergreifendes Databinding anwenden (UserControl ist architektonisch gleichrangig einem Form).
    Hallo.
    Also ich hab mich heute nochmals den ganzen Vormittag damit beschäftigt.

    ErfinderDesRades schrieb:

    dass noch annere Sachen an deren BindingSource hängen, etwa iwelche DatagridviewComboboxColumns
    Das wäre logisch, aber ich hab ja die BS extra für dafür neu erzeugt. Also sollte doch daran nichts anderes hängen. Wenn ich einer CB ein DatenMember zuweise und dabei nicht die vorhandene BS verwende, wird doch automatisch eine neue BS (mit Index 1 im Namen) angelegt. Und dann sollte doch nichts quer rein schießen... Dachte ich jedenfalls. Habe im Anhang nochmal das gesamte DataSet, vielleicht ist das ja noch irgenwie Interessant.


    ErfinderDesRades schrieb:

    Mir scheint hier auch zweckmäßig, mit UserControls zu arbeiten, pro Tab eines.
    Das habe ich jetzt auch mal versucht. Ich bekomme zwar das formübergreifendes Databinding hin, aber ich weiß noch nicht wie ich dann auf das AddingNew für den Filter und das CurrentChange Event für die Zelle- und Stations-ID reagieren soll.
    Das UC Script sieht aktuell noch wie Folgt aus, funktioniert natürlich so noch nicht richtig, bis auf die DataMember-zuordnung:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class KFaktUserControl
    3. Private Sub Eigenschaften_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.K_FaktorDGV.DataSource = Eigenschaften.K_FaktorBindingSource
    5. Me.StationenBindingSource.DataSource = Eigenschaften.StationenBindingSource
    6. Me.ZelleBindingSource.DataSource = Eigenschaften.ZelleBindingSource
    7. End Sub
    8. '#################################
    9. '# K_Faktor Add
    10. '#################################
    11. Private Sub K_FaktorBindingSource_Add(sender As Object, e As AddingNewEventArgs) Handles K_FaktorBindingSource.AddingNew
    12. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    13. Dim ZelleRw = DirectCast(DirectCast(ZelleBindingSource.Current, DataRowView).Row, Standard.ZelleRow)
    14. Dim StationRw = DirectCast(DirectCast(StationenBindingSource.Current, DataRowView).Row, Standard.StationenRow)
    15. Dim rwKF = DirectCast(DirectCast(e.NewObject, DataRowView).Row, Standard.K_FaktorRow)
    16. rwKF.ZelleRow = ZelleRw
    17. rwKF.StationenRow = StationRw
    18. End Sub
    19. '#################################
    20. '# K_Faktor Sortieren
    21. '#################################
    22. Private Sub Stat_Zell_BS_CurrentChanged(sender As Object, e As EventArgs) Handles StationenBindingSource.CurrentChanged, ZelleBindingSource.CurrentChanged
    23. If StationenBindingSource.Current Is Nothing Or ZelleBindingSource.Current Is Nothing Then Exit Sub
    24. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    25. Dim CurrentZelleRow = DirectCast(DirectCast(ZelleBindingSource.Current, DataRowView).Row, Standard.ZelleRow)
    26. Dim CurrentStationRow = DirectCast(DirectCast(StationenBindingSource.Current, DataRowView).Row, Standard.StationenRow)
    27. K_FaktorBindingSource.FilterX("ZelleID = ? AND StationsID = ?", CurrentZelleRow.ID, CurrentStationRow.ID)
    28. End Sub
    29. End Class

    Hier natürlich StationenBindingSource und ZelleBindingSource...

    Also wenn ihr jetzt nicht weiter kommt, dann hilft mir nur so lange probieren bis ich vielleicht per zufall auf eine Lösung komme. X/
    Bilder
    • Standard_DataSet.JPG

      172,15 kB, 1.169×833, 81 mal angesehen

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

    Also, ich hab jetzt den ganzen Tab leer geräumt und alle BS gelöscht. Außerdem alles nach Resten durchsucht. Dann alles wieder neu aufgebaut und jetzt scheint es schon etwas besser zu funktionieren. Leider löst folgende Zeile:

    VB.NET-Quellcode

    1. Dim rwKF = DirectCast(DirectCast(e.NewObject, DataRowView).Row, Standard.K_FaktorRow)
    diesen Fehler aus: Ausnahme ausgelöst: "System.NullReferenceException" in Oe-Meter V4.exe, sobald ich in die neue Zeile des DGVs klicke. Wieso das nun?? :S
    Warum ist e.NewObjekt jetzt null?

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

    weiß ich auch nicht.
    Aber ein Source-Backup hast du nicht zufällig gemacht, oder?
    Weil da könnte man nu schön vergleichen, wieso es vorher ging und nu nichme.
    Wenn kein Backup, dann ist das jedenfalls ein wesentlicher Lerngewinn: Wie wichtig Backups manchmal sind :P

    Kannste dir entweder ein SourceControl-Umgebung installieren, oder minimal dieses Progrämmle benutzen: SolutionExplorer - OpenSource
    Das kann u.a. auch Source-Backups zurecht-zippen.

    ErfinderDesRades schrieb:

    Aber ein Source-Backup hast du nicht zufällig gemacht, oder?

    Also ich hatte schon ein komplettes Backup des Projektordners, aber das reagiert genau so (was eigentlich nicht sein kann!). Dann hatte ich die Version von gestern in der DropBox und habe jetzt meinen Privaten PC (ohne Internetzugang, da ich Sie heute gelöscht hatte) gestartet und diese getestet, auch die Macht macht die gleichen Probleme.
    Dritte Alternative war die Version von vor dem ganzen Versuch. Also, Schritt für Schritt, - Extensions angelegt, DGV und CBoxen auf die Form und mit der DS verknüpft. Den Code rein Kopiert, aber keine Cance.. Gleicher Fehler.
    Ich geh morgen nochmal alle Sicherungen Durch.
    Ich hab jetzt alle Backup's durch. Keine bekomme ich so wieder zum laufen.. Ich verstehe nicht warum e.NewObject jetzt plötzlich null ist.
    So funktioniert es wieder (gefällt mir aber nicht):

    VB.NET-Quellcode

    1. Dim ZelleRw = DirectCast(DirectCast(ZelleBS_KFakt.Current, DataRowView).Row, Standard.ZelleRow)
    2. Dim StationRw = DirectCast(DirectCast(StationenBS_KFakt.Current, DataRowView).Row, Standard.StationenRow)
    3. Dim KF_Daten As DataRowView = DirectCast(K_FaktorBS.List, DataView).AddNew()
    4. KF_Daten.Row.Item("ZelleID") = ZelleRw.ID ' oder mit Spaltennummer
    5. KF_Daten.Row.Item("StationsID") = StationRw.ID ' oder mit Spaltennummer
    6. e.NewObject = KF_Daten


    ErfinderDesRades schrieb:

    da fällt mir ein, es gibt noch einen anneren Weg, ohne das ListChanged-Event.
    Ja, das wäre auch eine möglichkeit.. Das bezieht sich ja dann immer direkt auf die Werte in den CBs?
    Muss ich mal drüber nachdenken! Vielen Dank @ErfinderDesRades!!!!


    Edit:
    Ich hab auch schon Sowas probiert:

    VB.NET-Quellcode

    1. Dim KF_Daten As Standard.K_FaktorRow
    2. KF_Daten.ZelleID = ZelleRw.ID
    3. KF_Daten.StationsID = StationRw.ID
    4. e.NewObject = KF_Daten


    => System.NullReferenceException



    Edit 2:

    So würde es auch gehen:

    VB.NET-Quellcode

    1. Private Sub K_FaktorBindingSource_Add(sender As Object, e As AddingNewEventArgs) Handles K_FaktorBS.AddingNew
    2. Dim ZelleRw = DirectCast(DirectCast(ZelleBS_KFakt.Current, DataRowView).Row, Standard.ZelleRow)
    3. Dim StationRw = DirectCast(DirectCast(StationenBS_KFakt.Current, DataRowView).Row, Standard.StationenRow)
    4. Standard.K_Faktor.ZelleIDColumn.DefaultValue = ZelleRw.ID
    5. Standard.K_Faktor.StationsIDColumn.DefaultValue = StationRw.ID
    6. End Sub



    So bleibt es jetzt! Viiiilen Dank euch beiden!!
    Ihr habt mir unglaublich geholfen!
    :thumbsup:




    Jetzt erst Gelesen:

    ErfinderDesRades schrieb:

    wieso bsStation, bsZelle extra erstellen, um aufs bsKFaktor-AddingNew zu reagieren?
    Ich denk, das sind die BindingSources, an dene deine beiden Combos hängen?
    Also da könnte man sagen, die sind extra für die Combos erstellt, ja.

    Ja, war halt nur eine Info für mich...

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

    ErfinderDesRades schrieb:

    ähm den DefaultValue solltest du setzen, wenn sich eine der Combos (die den DefautlValue ja bestimmen) ändert.
    Das AddingNew-Event kann dann weg
    Aber damit reagiere ich ja auch auf ein Even. Und das ist dann doch auch nur indirekt zum DataSet/Binding (Stichwort typisiert...).
    Laut Dokumentation, tritt das BindingSource.AddingNew Event, bevor der zugrunde liegenden Liste ein Element hinzugefügt wird ein. Ich dachte das ist vielleicht Sinnvoller, da es direkt von der BindingSource kommt und nicht über "Umwege".

    Aber wenn du meinst dass ich anders besser fahre, änder ich das gerne ab. Deine Erfahrung und Wissen will ich nicht anzweifeln! ;) :thumbup:

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