Verständnisfrage zu DataBinding

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von crash.

    Verständnisfrage zu DataBinding

    Guten Tag zusammen,

    ich habe drei TextBoxen die an eine DataTable gebunden sind, genau genommen möchte ich sie exakt an die DataRow mit der der richtigen ID binden.
    In meinem Testprogramm klappt es auch das die Daten angezeigt und auch aktualisiert werden wenn ich die Daten im zugehörigen DataGridView manipuliere.

    Wenn ich Daten direkt in der DataTable ändere (Button) werden die Inhalte der TextBoxen eins und zwei aber nicht aktualisiert. Woran liegt das?

    Ich glaube hier liegt mein Problem aber wie macht man es richtig?

    VB.NET-Quellcode

    1. Dim source1 = bS.Item(bS.Find("id", 0))



    Vielen Dank :)

    Hier ist was ich hab:


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim WithEvents dTable As DataTable
    3. Dim bS As BindingSource
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Setup()
    6. End Sub
    7. Private Sub Setup()
    8. dTable = New DataTable
    9. dTable.TableName = "Names"
    10. dTable.Columns.Add("id", GetType(Integer))
    11. dTable.Columns.Add("name", GetType(String))
    12. dTable.Columns("id").AutoIncrement = True
    13. DataGridView1.DataSource = dTable
    14. Dim row1 As DataRow = dTable.NewRow()
    15. row1.Item("name") = "Peter"
    16. Dim row2 As DataRow = dTable.NewRow()
    17. row2.Item("name") = "Paula"
    18. dTable.Rows.Add(row1)
    19. dTable.Rows.Add(row2)
    20. bS = New BindingSource
    21. bS.DataSource = dTable
    22. Dim source1 = bS.Item(bS.Find("id", 0))
    23. Dim source2 = bS.Item(bS.Find("id", 1))
    24. TextBox1.DataBindings.Add("Text", source1, "name")
    25. TextBox2.DataBindings.Add("Text", source2, "name")
    26. TextBox3.DataBindings.Add("Text", bS, "name")
    27. End Sub
    28. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    29. Dim row1 = dTable.Rows(0).Item("name")
    30. Dim row2 = dTable.Rows(1).Item("name")
    31. dTable.Rows(0).Item("name") = row2
    32. dTable.Rows(1).Item("name") = row1
    33. End Sub
    34. Private Sub myTable_RowChanged(ByVal sender As Object, ByVal e As DataRowChangeEventArgs) Handles dTable.RowChanged
    35. '?
    36. End Sub
    37. End Class
    Ich verstehe nicht ganz. Ich habe den Code aus Post#1 übernommen.
    Vor dem Button-Klick

    danach

    So what?
    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.
    Verständnisfrage zu DataBinding
    Mir scheint, da fehlt ganz grundlegend das Verständnis.
    Databinding ist vor allem etwas statisches, etwas, was man nicht mit Code programmiert.
    Sondern man richtet es ein, in Designern.
    Richtig angefasst bestünde dein Form-Code nur aus den beiden Zeilen, wo du 2 DataRows zufügst. Und die wären auch viel einfacher:

    VB.NET-Quellcode

    1. Me.VerwaltungDataset1.Person.AddPersonRow("Peter")
    2. Me.VerwaltungDataset1.Person.AddPersonRow("Paula")
    Mehr Code darf es nicht geben - Alles andere ist in Designern eingerichtet, und dann flutscht das.
    Code, der zur Laufzeit ausgeführt wird hat nur die fatale Neigung, das in Designern eingerichtete wieder kaputtzumachen.
    gugge die vier Views auf Video - du versuchst derzeit einen DetailView.
    @VB1963: Da hatte ich wohl Tomatensalat auf den Augen :S
    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 und danke,

    Mein Primäres Ziel ist es den Inhalt von zur Laufzeit generierten Controls zu aktualisieren wenn in dem zugrundeliegenden Datatable Daten geändert werden.
    Ich hatte gehofft es realisieren zu können indem ich jedes Control an exakt die Column der entsprechenden Datarow Binde :huh: .

    @ErfinderDesRades die Videos gucke ich mir gleich mal an, hoffentlich bringen die etwas Licht ins dunkle.

    crash schrieb:

    Ich hatte gehofft es realisieren zu können
    Es ginge schon, wie folgt:

    VB.NET-Quellcode

    1. Dim source1 As New BindingSource
    2. Dim rw1 = CType(bS.Item(bS.Find("id", 0)), DataRowView)
    3. source1.DataSource = rw1
    4. Dim source2 As New BindingSource
    5. Dim rw2 = CType(bS.Item(bS.Find("id", 1)), DataRowView)
    6. source2.DataSource = rw2
    7. TextBox1.DataBindings.Add("Text", source1, "name")
    8. TextBox2.DataBindings.Add("Text", source2, "name")

    Aber nehme EDR's obige Zeilen zu Gute und studiere seine angegebenen TUT's - ist besser!

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

    crash schrieb:

    Mein Primäres Ziel ist es den Inhalt von zur Laufzeit generierten Controls zu aktualisieren wenn in dem zugrundeliegenden Datatable Daten geändert werden.
    laufzeit-generierte Controls widersprechen dem imperativen Ansatz von Databinding (also das statische).
    Man kanns frickeln, aber das ist eine Art Hacking, und sollte lieber erst unternommen werden, wenn man mit Databinding befreundet ist in der Art, wie es gedacht ist.
    Noch besser ist, laufzeit-generierte Controls bleiben zu lassen.

    (bzw. bei Wpf ists anders - da sind laufzeit-generierte Controls ein Feature des Databinding-Konzepts (DatTemplates).)

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