M:N-Relation Problem

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

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

    Du hast gut reden. du wüsstest definitiv wie genau. ich halt noch nicht.ich grübel noch über deinen Vorschlag :)
    als erstes würde ich nach betätigen eines buttons die Änderungen übernehmen und die gecheckten Eigenschaftgen ermitteln. dann muss ich sie irgendwie an dieentsprechende datatable übergeben...oder wie meinst du könnte ich das regeln? welche3 Events wären denn das?

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

    Hab ein Extra-UserControl gebastelt, fein getrennt vom anderen Kram der Anwendung.
    Tatsächlich war CellContentClick entbehrlich, allerdings zeichnet sich das Checkbox-Grid nicht neu, wenn das annere Grid den Datensatz wechselt. Deshalb brauchts per BindingSource_CurrentChanged noch eine Extra-Aufforderung.

    The whole Story:

    VB.NET-Quellcode

    1. Imports PersonProfessionVB.PersonProfessionDts
    2. Public Class uclMnCheckboxView
    3. Private Sub dgvProfession_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvProfession.CellFormatting
    4. If e.ColumnIndex <> 0 OrElse e.RowIndex < 0 OrElse e.RowIndex >= bsProfession.Count Then Return
    5. Dim rwProf = DirectCast(DirectCast(dgvProfession.Rows(e.RowIndex).DataBoundItem, DataRowView).Row, ProfessionRow)
    6. Dim rwPers = DirectCast(DirectCast(bsPerson.Current, DataRowView).Row, PersonRow)
    7. e.Value = rwProf.GetPersonProfessionRows.Any(Function(rwPP) rwPP.PersonRow Is rwPers) ' ergibt True, wenn ZuordnungsDatensatz gefunden
    8. End Sub
    9. Private Sub dgvProfession_CellParsing(sender As Object, e As DataGridViewCellParsingEventArgs) Handles dgvProfession.CellParsing
    10. If e.ColumnIndex <> 0 OrElse e.RowIndex < 0 OrElse e.RowIndex >= bsProfession.Count Then Return
    11. Dim rwProf = DirectCast(DirectCast(dgvProfession.Rows(e.RowIndex).DataBoundItem, DataRowView).Row, ProfessionRow)
    12. Dim rwPers = DirectCast(DirectCast(bsPerson.Current, DataRowView).Row, PersonRow)
    13. If CBool(e.Value) Then
    14. PersonProfessionDts.PersonProfession.AddPersonProfessionRow(rwPers, rwProf) ' ZuordnungsDatensatz anlegen
    15. Else
    16. rwProf.GetPersonProfessionRows.First(Function(rwPP) rwPP.PersonRow Is rwPers).Delete() ' ZuordnungsDatensatz löschen
    17. End If
    18. End Sub
    19. Private Sub bsPerson_CurrentChanged(sender As Object, e As EventArgs) Handles bsPerson.CurrentChanged
    20. dgvProfession.InvalidateColumn(0) ' dgvProfession-Zeichnung aktualisieren
    21. End Sub
    22. End Class

    Dateien

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

    @EDR....Daaaanke....du bist mein Held....hab zwar eine Weile gebraucht um zu verstehen was da passiert und wie ich es an meine Bedürfnisse anpassen kann aber ich habe es geschafft und es funktioniert bestens.
    Ein paar Fragen habe ich aber.
    1. du bindest das dataset an bsmain. Ist das nötig um es getrennt von allem zu behandeln?
    2. Ich lege Artikel (ich hab deine Helferlein eingebunden habe, dafür auch ein großes Dankeschön :thumbup: , ist mir teilweise noch etwas zu hoch)...somit rufe ich über ArtikelBindingSource.EditNew(Of dlgArtikel) das form für die Anlage auf. Nachdem ich jetzt alle Daten eingegeben habe würde ich gern die Eigenschaften bzw. die Eigenschaftswerte zuweisen. geht aber nicht weil der Artikel noch nicht in der Artikelbindingsource angelegt ist. Erst wenn ich das mit OK bestätige. jetz könnte ich über Edit das ganze realisieren aber das finde ich nicht so schön. Hast du einen Tipp wie ich das dennoch hinbekomme?
    zu 1) ich wüsste nicht, dass ich das dataset - welches genau meinst du? - an bsMain binde.
    annersrum ergibts vlt. sinn: dass bsMain an ein Dataset gebunden wird.
    Also Databinding hat immer auch eine Richtung: Irgendetwas wird an eine Datenquelle gebunden: Eine BindingSource an ein Dataset, ein Control an eine BindingSource, oder auch eine BindingSource an eine annere BindingSource.
    (kann man vlt. auch anners definieren, aber das ist halt, wie ich empfehle, die Begrifflichkeiten aufzufassen)

    Wie gesagt: Genau weiss ich nicht, was du damit meinst - gibt es eine spezielle Codestelle dazu?

    zu 2)
    Ich lege Artikel (ich hab deine Helferlein eingebunden habe, dafür auch ein großes Dankeschön, ist mir teilweise noch etwas zu hoch)...somit rufe ich über ArtikelBindingSource.EditNew(Of dlgArtikel) das form für die Anlage auf.
    Sorry - dieser Satz ist aus grammatischen Gründen unverständlich - versuchs nochmal, wenn wolle.
    Ok...Sorry für die Verwirrung....war wohl gestern schon zu spät...natürlich hast du zu Punkt 1 recht...bsmain an das dataset..meine Frage war jetzt ist dies nötig um das ganze getrennt vom anderen Kram zu behandeln?Punkt 2. Ich lege die Artikel an in dem ich über ArtikelBindingSource.EditNew(Of dlgArtikel) ein neues Form aufmache. Dort ist nicht das datagridview der Artikel drauf sondern die Details. Wenn ich jetzt alles eingehen habe. Name, Kategorie, Lieferant....etc drück ich auf ok, das Fenster schließt sich und Artikel ist angelegt und über die artikelbindingsource aufrufbar. Bevor ich ok drücke würde ich gerne dem Artikel die Eigenschaften zuweisen. Wenn ich jetzt das uclMnCheckboxView aufrufe dann fehlt der Artikel noch in der artikelbindingsource. Somit kann ich ihm keine Werte zuweisen....gibt es hier noch eine Möglichkeit? Oder muss ich wirklich erst dafür sorgen das der Artikel angelegt ist und dann nochmal editiere?
    zu 1) Natürlich muss bsMain ans Dataset gebunden sein - woher soll sie sonst die Daten nehmen?
    Jede BindingSource muss ans Dataset gebunden sein - sonst funzt ja wohl garnichts.

    zu 2) ArtikelBindingSource.EditNew(Of dlgArtikel) sollte einen neuen Artikel-Datensatz erstellen, und das aufgehende Form sollte ihn editieren können.
    Man muss nicht dafür sorgen, dass der Artikel bereits da ist.
    Andernfalls läuft was falsch.
    Was meinst du mit "Details" - damit sind doch Properties des Artikel-Datensatzes gemeint, oder?
    Gar nicht verstehe ich, warum du da noch Eigenschaften zuweisen willst, wenn du ok drückst.
    Die Eigenschaften sind doch bereits über Bindings zugewiesen, was willst du die nochmal zuweisen??
    Hallo EDR...mal wieder etwas Zeit ins Land gegangen. Aber da bin ich wieder :)
    ja ich kann den Artikel mit ArtikelBindingSource.EditNew(Of dlgArtikel) erstellen. Soweit geht es ja. Nun möchte ich diesen frisch editierten Artikel seine Eigenschaften und deren Werte zuweisen. Ich befinde mich immernoch im ArtikelBindingSource.EditNew(Of dlgArtikel). Hier ist mein Problem. Wenn ich jetzt deine UclMnCheckboxView aufrufe werden die Daten eingelesen. Der eben editierte Artikel ist aber noch nicht vorhanden. Mit dem Aufrufen des UclMnCheckboxView kann ich nur die schon in der Artikelbindingsource befindliche Daten bearbeiten bzw. die Eigenschaften zuweisen. das meinte ich damit worauf du geantwortet hast:
    Man muss nicht dafür sorgen, dass der Artikel bereits da ist.


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

    kannst mal im Form_Load des EditDialoges gucken, ob du Zugriff auf den neuen Datensatz bekommst.

    Ah - ich sehe grad bei mir eine EditNew - Überladung, der du mittels TupleList alle Initialisierungswerte übergeben kannst

    VB.NET-Quellcode

    1. ''' <summary> editiert bs.AddNew im angegebenen Dialog-Form. </summary>
    2. <Extension()> _
    3. Public Function EditNew(Of T As {Form, New})( bs As BindingSource, defaultValues As TupleList(Of DataColumn, Object), Optional owner As Form = Nothing, Optional onErrorRetry As Boolean = False) As DialogResult
    4. Dim drv = DirectCast(bs.AddNew, DataRowView)
    5. defaultValues.ForEach(Sub(tpl) drv(tpl.Item1.ColumnName) = tpl.Item2)
    6. Return EditItem(Of T)(bs, drv, onErrorRetry, owner)
    7. End Function
    Kann aber gut sein, dassich das nicht veröffentlicht habe, weil TupleList ist Bestandteil meins Komplett-Helper-Systems, und erfordert wohl meist eine Extra-Einweisung.
    Ich hab oft nur abgespeckte Helpers-Versionen veröffentlicht - aber kannst ja mal gugge, ob das Teil in deiner Version dabei ist.

    Wenn ja, hätteste eiglich selbst drauf stossen können - Intellisense bietet diese Überladung ja auch an, und der Parameter-Name defaultValues ist eiglich unmissverständlich, auch wenn man nicht weiß, was eine TupleList ist.

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