DGV auf Form1, selektierten Datensatz in Form2 anzeigen

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von OliverSte.

    DGV auf Form1, selektierten Datensatz in Form2 anzeigen

    Hi,

    auf Form1 habe ich ein wunderschönes DGV, welches über eine BindingSource Daten einer DataSets anzeigt.
    Dgv.DataSource=ICaBS
    ICaBS.DataSource=ICaDts
    ICaBS.DataMember="ICa"


    Auf Form2 soll ein Datensatz mit Textboxen editiert/angezeigt werden.
    Die DataBindings Eigenschaft der Textbox "tbName" habe ich auf ICaBS - Nachname eingestellt.
    Die DataBindings Eigenschaft der Textbox "tbBemerkung" habe ich auf KDBS - Bemerkung eingestellt.
    Die Tabelle KD ist eine Childtabelle von ICa.

    ICaBS.DataSource=ICaDts
    ICaBS.DataMember="ICa"
    KDBS.DataSource=ICaBS
    KDBS.DataMember="ICa_KD"


    Beim Klick auf einen Button soll Form2 öffnen und die dortigen BindingSources auf dem selben (nicht nur dem gleichen!) Datensatz stehen, wie in Form1.
    So funktioniert es nicht:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. ICaDts.Register(Me, False)
    4. End Sub
    5. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. ICaBS.ChangeBinding(Form1.ICaDts, "ICa")
    7. KDBS.ChangeBinding(Form1.ICaBS, "ICa_KD")
    8. End Sub


    Wie bekomme ich es hin, dass die BindingSources quasi synchronisiert werden?

    Ok, es funktioniert irgendwie so (mit den Winform Helpers von @ErfinderDesRades) :

    VB.NET-Quellcode

    1. ICaBS.EditCurrent(Of Form2)()


    Damit wird in der Textbox tbNachname schon mal das richtige angezeigt.
    Aber die tbBemerkung, die ja aus einer anderen BindingSource gefüttert wird, verhält sich noch nicht so, wie ich es wünsche. Ich würde da gerne etwas eingeben, was dann nach dem Schließen von Form2 gespeichert und beim erneuten Öffnen auch wieder angezeigt wird. Das klappt noch nicht.


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

    Äh, nein, dass isses nich. Die BindingSource springt ja schon zum richtigen Datensatz (kann man das so sagen?).
    Was nicht angezeigt wird, sind die Daten der Childtabelle "KD".
    Und da liegt der Hase im Pfeffer. Die Lösung ist so einfach wie nahe liegend. Es ist nämlich gar kein Datensatz vorhanden. Dann kann auch nix angezeigt werden, ist ja klar.

    Also gehört ins Load vom Form2:

    VB.NET-Quellcode

    1. Dim rwICa = ICaBS.At(Of ICaDataSet.ICaRow)
    2. If rwICa.GetKDRows.Count = 0 Then
    3. ICaDts.KD.AddKDRow(rwICa, "", "", 0, "", ... )
    4. End If

    Fertig.
    (Ist klar, dass statt der ... noch ein paar Felder befüllt werden.)

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

    ErfinderDesRades schrieb:

    tja - möglicherweise musst du die Datensätze, die du selectiert haben willst, dem Form2 richtig übergeben


    Kannst mir bitte gerade mal einen Wink geben, wie man das macht? In Form2.Show() ist kein Platz für sowas, oder?
    Deine BS.EditCurrent() Erweiterung ist ja schon ganz cool, ich möchte aber nichts eingeben oder editieren, sondern nur gewissermaßen als Zusatzinfo anzeigen. Die Eingabe von Daten erfolgt in einem Form3. Ein modaler Dialog eignet sich nicht so gut dafür :thumbdown:
    Ich hab es mal mit einer zweiten New() Methode, nämlich einer mit Parameter versucht.
    Wenn ich die dann aufrufe und die current row der BindingSource übergebe, macht das Ding, was ich möchte.

    Erstmal hab ich im Deklarationsbereich der Form-Klasse ein Objekt deklariert:

    VB.NET-Quellcode

    1. Dim KlinischeDaten As KlinischeDaten


    Auf Button-Click dann das hier.

    VB.NET-Quellcode

    1. Dim rwICa = ICaBS.At(Of ICaDataSet.ICaRow)
    2. ' öffne die klinischen Daten als Form
    3. If Not KlinischeDaten Is Nothing Then KlinischeDaten.Dispose()
    4. KlinischeDaten = New KlinischeDaten(rwICa)
    5. KlinischeDaten.Show()


    Die zweite New() Methode sieht so aus:

    VB.NET-Quellcode

    1. Public Sub New(rwICaBS As ICaDataSet.ICaRow)
    2. InitializeComponent()
    3. ICaDts.Register(Me, False)
    4. ConfigDts.Register(Me, False)
    5. ICaBS.MoveToRow(rwICaBS)
    6. Me.Location = New Point(My.Computer.Screen.Bounds.Width - 1010, CInt((My.Computer.Screen.Bounds.Height - 749) / 2))
    7. End Sub


    Jetzt kann ich EditCurrent machen und das Form modal öffnen oder eben nicht, ganz wie ich will ^^

    War es das, was du meintest @ErfinderDesRades?

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