Formübergreifendes Databinding, Fehler

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RadlerMEV.

    Formübergreifendes Databinding, Fehler

    ich lese hier schon eine ganze Weile alles quer zum Thema DB-Entwicklung.
    Es gilt, eine in die Jahre gekommene Access.adp-Anwendung abzulösen. Die Tabellenstruktur ist eigentlich klar, wid aber auch modifiziert.
    Die Phase anfangen, verwerfen, Dataset, dann doch typisiert, Tableadapter wegwerfen usw., da bin ich mitten drin!
    Also erst einmal Dank an alle, die hier ihr Wissen und ihre Erfahrungen weitergeben!

    Als letztes habe ich die HelpersSmallEd eingebunden....

    Als DB habe ich den SQLSERVER (Express). Konkret habe ich (als Beispiel) ein Formular mit einem DGV.

    Dank der Helpers nutze ich jetzt T135teamBS.EditCurrent(Of Frm_135_team_dlg) und T135teamBS.EditNew(Of Frm_135_team_dlg) für die Baerbeitung und das Erstellen neuer Datensätze. Funktioniert.

    Nun habe ich folgenden Gedanken: Gelegentlich ist es sinnvoll, gleich mehrere neue Datensätze anzulegen, die dann im Nachgang nur angepasst werden.
    Dazu nutze ich Frm_135_team_insert_loop aufgerufen von Frm_135_team_v02.

    Bis zum Aufruf ist das Dataset Ds_135_team_oTA.t135_team (als Beispiel Tabelle t135_team) auch gefüllt.

    Lande ich vom Frm_135_team_insert_loop wieder in Frm_135_team_v02.Teams_anlegen ist das Dataset leer.
    Folge ist ein Constraint-Fehler.

    Die Variante B aus Frm_135_team_insert_loop bringt keinen Fehler, aber ich seh da auch nichts Neues ...

    Frm_135_team_v02.TestToolStripMenuItem_Click funktioniert, da werden die Datensätze geschrieben, ist ja auch innerhalb des Formulars ...

    Fragen, ja, einige ...

    a) Könnte es sein das sich die Konzepte SqlServerPersistance und HelpersSmallEd hier nicht vertragen?
    Oder ich setze sie falsch ein?
    Beim Speichern habe ich da auch noch Bedenken, HelpersSmallEd geht ja über den OK-Button im modalen Formular, greift aber auch ein wenn das Dataset nicht gespeichert ist.
    Frm_135_team_v02.DataSet_Speichern ist aber auch noch da ....

    b) Bei T135teamBS.EditCurrent(Of Frm_135_team_dlg)() und T135teamBS.EditNew(Of Frm_135_team_dlg)() ist ja das Formübergreifende Databinding mit drin,
    hier fehlt es wahrscheinlich und deshalb geht es nicht.

    c) Wo sollte das Anfügen der neuen Datensätze laufen, in Frm_135_team_v02 oder in Frm_135_team_insert_loop?

    Ich sehe hier nur gerade keinen Weg, was dann wie zu sortieren wäre ....

    Vielen Dank schon mal für Eure Zeit ...

    Und was Euch sonst noch auffällt, her damit.



    VB.NET-Quellcode

    1. Public Class Frm_135_team_v02
    2. Private _Persistance As SqlServerPersistance
    3. Dim str_SucheIn As String = String.Empty
    4. Dim dr As DialogResult
    5. Dim int_t135 As Int32
    6. Public Sub New()
    7. InitializeComponent()
    8. _Persistance = New SqlServerPersistance(Frm_000_anmeldung.str_connStr, Ds_135_team_oTA)
    9. End Sub
    10. Private Sub Frm_135_team_v02_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. _Persistance.FillAll()
    12. Me.Ds_135_team_oTA.Register(Me, True) 'Helpers
    13. 'Formular für KeyDown vorbereiten!
    14. Me.KeyPreview = True
    15. txt_count_record.Text = T135teamBS.Count.ToString("N0")
    16. cbo_suchbegriff.Visible = False
    17. int_t135 = Ds_135_team_oTA.t135_team.Count
    18. 'MessageBox.Show("int_t135 Start: " & CStr(int_t135), "INFO", MessageBoxButtons.OK)
    19. End Sub
    20. Private Sub DataSet_Speichern()
    21. _Persistance.Save()
    22. tssl.Text = "Datensätze wurden gespeichert."
    23. txt_count_record.Text = T135teamBS.Count.ToString("N0")
    24. End Sub
    25. Private Sub SpeichernF9ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernF9ToolStripMenuItem.Click
    26. DataSet_Speichern()
    27. End Sub
    28. 'wird auch in Helpers behandelt, hier habe ich aber kein modales FRM mot OK-Button...
    29. Private Sub Frm_135_team_v02_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    30. Dim dr As DialogResult
    31. If Ds_135_team_oTA.HasChanges() Then
    32. 'Änderungen anzeigen
    33. 'btn_save.BackColor = Color.LightCoral
    34. dr = MessageBox.Show("Es gibt noch nicht gespeicherte Änderungen! Speichern?", "Speichern", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    35. If dr = DialogResult.Yes Then
    36. DataSet_Speichern()
    37. End If
    38. End If
    39. End Sub
    40. 'Sinnvoll?
    41. Private Sub Dgv_135_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles dgv_135.DataError
    42. MessageBox.Show("Error happened " _
    43. & e.Context.ToString())
    44. If (e.Context = DataGridViewDataErrorContexts.Commit) _
    45. Then
    46. MessageBox.Show("Commit error")
    47. End If
    48. If (e.Context = DataGridViewDataErrorContexts _
    49. .CurrentCellChange) Then
    50. MessageBox.Show("Cell change")
    51. End If
    52. If (e.Context = DataGridViewDataErrorContexts.Parsing) _
    53. Then
    54. MessageBox.Show("parsing error")
    55. End If
    56. If (e.Context =
    57. DataGridViewDataErrorContexts.LeaveControl) Then
    58. MessageBox.Show("leave control error")
    59. End If
    60. If (TypeOf (e.Exception) Is ConstraintException) Then
    61. Dim view As DataGridView = CType(sender, DataGridView)
    62. view.Rows(e.RowIndex).ErrorText = "an error"
    63. view.Rows(e.RowIndex).Cells(e.ColumnIndex) _
    64. .ErrorText = "an error"
    65. e.ThrowException = False
    66. End If
    67. End Sub
    68. Private Sub NeuesTeamAnlegenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NeuesTeamAnlegenToolStripMenuItem.Click
    69. T135teamBS.EditNew(Of Frm_135_team_dlg)() 'HelpersSmallEd.dll
    70. End Sub
    71. Private Sub Dgv_135_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv_135.CellDoubleClick
    72. T135teamBS.EditCurrent(Of Frm_135_team_dlg)() 'HelpersSmallEd.dll
    73. End Sub
    74. Private Sub MehrereTeamsAnlegenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MehrereTeamsAnlegenToolStripMenuItem.Click
    75. Dim frm As New Frm_135_team_insert_loop
    76. frm.Show(Me)
    77. End Sub
    78. Public Sub Teams_anlegen(ByVal int_sparte As Integer,
    79. ByVal int_nation As Integer,
    80. ByVal int_tkat As Integer,
    81. ByVal dat_von As Date,
    82. ByVal dat_bis As Date,
    83. ByVal str_bezeichnung As String,
    84. ByVal int_anzahl As Integer)
    85. 'ist die Datatable gefüllt?
    86. int_t135 = Ds_135_team_oTA.t135_team.Count
    87. '-->> PROBLEM Ds_135_team_oTA(.t135_team) ist leer
    88. 'Constraint-Fehler
    89. If int_t135 > 0 Then
    90. For i = 1 To int_anzahl
    91. 'Struktur der Zeile
    92. Dim rwTeam = Ds_135_team_oTA.t135_team.Newt135_teamRow
    93. rwTeam.t135_t105_id = int_sparte
    94. rwTeam.t135_t100_id = int_nation
    95. rwTeam.t135_suchname_team = str_bezeichnung & " " & Convert.ToString(i).PadLeft(2, CChar("0"))
    96. rwTeam.t135_name_team = rwTeam.t135_suchname_team
    97. rwTeam.t135_t134_id = int_tkat
    98. rwTeam.t135_von = dat_von.Date
    99. rwTeam.t135_bis = dat_bis.Date
    100. rwTeam.t135_gueltig_jn = CBool(1)
    101. rwTeam.t135_rf_blockstart_ezf_order = 1
    102. rwTeam.t135_kurz3 = Nothing
    103. rwTeam.t135_rf_email_leiter_team = Nothing
    104. rwTeam.t135_rf_name_leiter_team = Nothing
    105. rwTeam.t135_rf_tel_leiter_team = Nothing
    106. 'Zeile der DataTable hinzufügen
    107. Ds_135_team_oTA.t135_team.Rows.Add(rwTeam)
    108. Next
    109. tssl.Text = "Die Teams wurden angelegt."
    110. 'DataSet_Speichern()
    111. Else
    112. MessageBox.Show("int_t135: " & CStr(int_t135), "FEHLER", MessageBoxButtons.OK)
    113. End If
    114. End Sub
    115. Private Sub Frm_135_team_v02_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    116. If e.KeyCode = Keys.F9 Then
    117. DataSet_Speichern()
    118. ElseIf e.KeyCode = Keys.F7 Then
    119. T135teamBS.EditCurrent(Of Frm_135_team_dlg)() 'HelpersSmallEd.dll
    120. ElseIf e.KeyCode = Keys.F5 Then
    121. T135teamBS.EditNew(Of Frm_135_team_dlg)() 'HelpersSmallEd.dll
    122. End If
    123. End Sub
    124. Private Sub EditToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EditToolStripMenuItem.Click
    125. T135teamBS.EditCurrent(Of Frm_135_team_dlg)() 'HelpersSmallEd.dll
    126. End Sub
    127. Private Sub TestToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TestToolStripMenuItem.Click
    128. 'ZUM TEST, ohne Wechsel auf ein anderes FRM: läuft ...
    129. 'Variante 01
    130. int_t135 = Ds_135_team_oTA.t135_team.Count
    131. Dim int_t134 = Ds_135_team_oTA.t134_teamkategorie.Count
    132. For i = 1 To 3
    133. 'Struktur der Zeile
    134. Dim rwTeam = Ds_135_team_oTA.t135_team.Newt135_teamRow
    135. rwTeam.t135_t105_id = 2
    136. rwTeam.t135_t100_id = 2
    137. rwTeam.t135_suchname_team = "2020 RG BDR " & " " & Convert.ToString(i).PadLeft(2, CChar("0"))
    138. rwTeam.t135_name_team = rwTeam.t135_suchname_team
    139. rwTeam.t135_t134_id = 6
    140. rwTeam.t135_von = CDate("15.03.2020").Date
    141. rwTeam.t135_bis = CDate("15.10.2020").Date
    142. rwTeam.t135_gueltig_jn = CBool(1)
    143. rwTeam.t135_rf_blockstart_ezf_order = 1
    144. rwTeam.t135_kurz3 = Nothing
    145. rwTeam.t135_rf_email_leiter_team = Nothing
    146. rwTeam.t135_rf_name_leiter_team = Nothing
    147. rwTeam.t135_rf_tel_leiter_team = Nothing
    148. 'Zeile der DataTable hinzufügen
    149. Ds_135_team_oTA.t135_team.Rows.Add(rwTeam)
    150. Next
    151. End Sub
    152. End Class




    VB.NET-Quellcode

    1. Public Class Frm_135_team_insert_loop
    2. Dim dr As DialogResult
    3. Private _Persistance As SqlServerPersistance
    4. Public Sub New()
    5. InitializeComponent()
    6. _Persistance = New SqlServerPersistance(Frm_000_anmeldung.str_connStr, Ds_135_team_oTA)
    7. End Sub
    8. Private Sub Frm_135_b_teams_anlegen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. 'kein modales Formular oder doch? Helpers vs. SqlServerPersistance ...
    10. _Persistance.CustomFill(Ds_135_team_oTA.t134_teamkategorie, "Where t134_id>0")
    11. _Persistance.CustomFill(Ds_135_team_oTA.t100_nation, "Where t100_id>0")
    12. _Persistance.CustomFill(Ds_135_team_oTA.t105_sparte, "Where t105_id>0")
    13. '_Persistance.CustomFill(Ds_135_team_oTA.t135_team, "Where t135_id>0") 'brauche ich ja eigentlich nicht
    14. 'Formular für KeyDown vorbereiten!
    15. Me.KeyPreview = True
    16. Me.cbo_t135_t105_id.SelectedValue = 2 'STR
    17. Me.cbo_t135_t100_id.SelectedValue = 2 'GER
    18. Me.cbo_t135_t134_id.SelectedValue = 6 'RG
    19. TextBox1.Text = "t105: " + CStr(Ds_135_team_oTA.t105_sparte.Count) '6 Datensätze aus t105_sparte
    20. End Sub
    21. Private Sub SpeichernF9ToolStripMenuItem_Click(sender As Object, e As EventArgs)
    22. Teams_anlegen()
    23. End Sub
    24. Private Sub Frm_135_b_teams_anlegen_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    25. If e.KeyCode = Keys.F9 Then
    26. Teams_anlegen()
    27. End If
    28. End Sub
    29. Private Sub Teams_anlegen()
    30. 'Variante A
    31. 'Übergabe der Parameter an Frm_135_team, Procedure Teams_anlegen
    32. 'läuft nicht ...
    33. Frm_135_team_v02.Teams_anlegen(int_sparte:=CInt(cbo_t135_t105_id.SelectedValue),
    34. int_nation:=CInt(cbo_t135_t100_id.SelectedValue),
    35. int_tkat:=CInt(cbo_t135_t134_id.SelectedValue),
    36. dat_von:=dtp_t135_von.Value,
    37. dat_bis:=dtp_t135_bis.Value,
    38. str_bezeichnung:=txt_t135_name_team.Text,
    39. int_anzahl:=CInt(txt_anzahl.Text))
    40. 'Variante B
    41. 'keine Fehlermeldung, aber auch keine sichtbaren neuen Datensätze, wahrscheinlich ein anderes Dataset?
    42. ' For i = 1 To CInt(txt_anzahl.Text)
    43. ' 'Struktur der Zeile
    44. ' Dim rwTeam = Ds_135_team_oTA.t135_team.Newt135_teamRow
    45. ' rwTeam.t135_t105_id = CInt(cbo_t135_t105_id.SelectedValue)
    46. ' rwTeam.t135_t100_id = CInt(cbo_t135_t100_id.SelectedValue)
    47. ' rwTeam.t135_suchname_team = txt_t135_name_team.Text & " " & Convert.ToString(i).PadLeft(2, CChar("0"))
    48. ' rwTeam.t135_name_team = rwTeam.t135_suchname_team
    49. ' rwTeam.t135_t134_id = CInt(cbo_t135_t134_id.SelectedValue)
    50. ' rwTeam.t135_von = dtp_t135_von.Value.Date
    51. ' rwTeam.t135_bis = dtp_t135_bis.Value.Date
    52. ' rwTeam.t135_gueltig_jn = CBool(1)
    53. ' rwTeam.t135_rf_blockstart_ezf_order = 1
    54. ' rwTeam.t135_kurz3 = Nothing
    55. ' rwTeam.t135_rf_email_leiter_team = Nothing
    56. ' rwTeam.t135_rf_name_leiter_team = Nothing
    57. ' rwTeam.t135_rf_tel_leiter_team = Nothing
    58. ' 'Zeile der DataTable hinzufügen
    59. ' Ds_135_team_oTA.t135_team.Rows.Add(rwTeam)
    60. ' Next
    61. Me.Close()
    62. End Sub
    63. Private Sub Btn_ok_Click(sender As Object, e As EventArgs) Handles btn_ok.Click
    64. Teams_anlegen()
    65. End Sub
    66. Private Sub Btn_cancel_Click(sender As Object, e As EventArgs) Handles btn_cancel.Click
    67. Me.Close()
    68. End Sub
    69. End Class

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

    Ich habe da was gefunden...

    Aus Frm_135_team_insert_loop geht der Aufruf _Persistance.CustomFill raus und Me.Ds_135_team_oTA.Register(Me, True) rein

    VB.NET-Quellcode

    1. '_Persistance.CustomFill(Ds_135_team_oTA.t134_teamkategorie, "Where t134_id>0")
    2. '_Persistance.CustomFill(Ds_135_team_oTA.t100_nation, "Where t100_id>0")
    3. '_Persistance.CustomFill(Ds_135_team_oTA.t105_sparte, "Where t105_id>0")
    4. '_Persistance.CustomFill(Ds_135_team_oTA.t135_team, "Where t135_id>0")
    5. Me.Ds_135_team_oTA.Register(Me, True) 'Helpers


    Das Insert der neuen Sätze erfolgt dann auch in Frm_135_team_insert_loop.
    Ich teste das und melde mich hier.
    Muß mich noch etwas mit dem "Register" beschäftigen.
    Dein Code-"Snippet" ist mir deutlich zu lang.
    aber immerhin scheint erkennbar, dass du tatsächlich das mit dem Register nicht richtig handhabst.
    In jedem Form, wo mit deim Dataset gearbeitet wird, musste es Registrieren, nachdem(!) InitializeComponents durchgelaufen ist.
    Ausnahmen bilden die Edit-Forms, weil die werden ja von bs.EditCurrent/bs.EditNew aufgerufen - da wird schon fürs Registrieren gesorgt.