DataBinding die Xte, ID-Wert aktualisieren

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    DataBinding die Xte, ID-Wert aktualisieren

    Hallo zusammen,

    ich habe mir eine kleine Test-Access-ACCDB Datei erstellt. 2 Tabellen (Personen, Telefonnr). Beide haben ein Autowert ID-Feld als Long Integer.

    Personen_______Telefonnr
    ID_____________ID
    Vorname_______PersonenID (auch Zahl, Long Integer)
    Nachname_____Vorwahl
    ______________Durchwahl

    Dann habe ich diese Datenbank in mein Projekt eingebunden. Dann noch schnell eine Form mit 3 Buttons (Btn_Neue_Person, Btn_Speichern und Btn_Aktualisieren angelegt und den Anzeigetext geändert. Dann habe ich mir den DataSet-Designer geöffnet und eine Beziehung (Join) von Personen.ID nach Telefon.PersonenID gezogen, noch schnell den Punkt bei 'Sowohl Bezeichungs- als auch Fremdschlüsseleinschränkung aktiviert (Cascade, Cascade, None wurden ja automatisch eingestellt). Dann zurück in die Form und dort die Datetnquellen geöffnet. Als erstes dann die Personen-Tabelle als DGV auf die Form gezogen und dann die verknüpfte Tabelle 'Telefonnr' auch als DGV rüber gezogen. Weitere Einstellungen habe ich nicht mehr vorgenommen.

    Vor den ersten Start habe ich ein paar Testdaten in beide Tabellen eingetragen, damit ich zu mindestens das Join-Ergebnis sehen kann.

    Danach das ganze mit unten stehenden Code gestartet.

    Ergebnis
    1. Links in dem Personen-DGV stehen alle Datensätze vollständig drin. Auch die Telefonnr. für den ersten Datensatz werden angezeigt.
    2. Wechsel ich nun den Datensatz, dann ändert sich auch die Anzeige im Telefon-DGV
    3. Ändere ich nun im DGV den Vornamen bzw. Nachnamen und verlasse den Datensatz, werden diese Änderungen auch in der Access-Tabelle angezeigt (ggf. F5 drücken)
    4. Möchte ich nun einen neuen Datensatz eintragen, drücke ich Btn_Neue_Person und trage dort den Vornamen ein. Die ID ist -1.

    Soweit alles gut und schön.

    Möchte ich aber auch eine Telefonnr. eintragen, so kann ich dies zwar tun. Es wird auch PersonenID = -1 übernommen, aber wenn ich das ganze abspeichere, dann bekommt zwar Person.ID einen Autowert, dieser wird aber nicht in Telefonnr.PersonenID mit geändert. Dort steht in der Access-Datenbank immer noch -1.

    Jetzt die Frage:
    Wie komme ich direkt nach der Inputbox die ID aktualisiert zurück geliefert und kann somit auch die Telefonnr. eintragen. Denn mache ich die Eingabe einer Telefonnr. die schon einen Wert PersonenID>0 hat, so klappt der Rest einwandfrei.

    All die Beispiele, die ich bisher gesehen habe, fügen keinen neuen Datensatz hinzu in beiden Tabellen. Die meisten Beispiele sind nur für eine Tabelle.

    Über eine kurze Rückmeldung würde ich mich sehr freuen.

    Volker

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.Common
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ' Braucht man diese Zeilen?
    5. ' Wenn ja, dann muss man ggf. die Reihenfolge ändern: Erst die Haupttabellen und dann zum Schluss die Untertabellen
    6. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Personen". Sie können sie bei Bedarf verschieben oder entfernen.
    7. Me.PersonenTableAdapter.Fill(Me.TestDBDataSet.Personen)
    8. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Telefonnr". Sie können sie bei Bedarf verschieben oder entfernen.
    9. Me.TelefonnrTableAdapter.Fill(Me.TestDBDataSet.Telefonnr)
    10. PersonenDataGridView.AllowUserToAddRows = False
    11. ' TelefonnrDataGridView.AllowUserToAddRows = False
    12. End Sub
    13. Sub Speichern()
    14. ' Ist eine extra SUB, damit diese von jeder Stelle ggf. aufgerufen werden kann.
    15. Try
    16. ' Überprüft die Eingaben
    17. Me.Validate()
    18. ' Die Änderungen werden in die DataTable geschrieben
    19. Me.TelefonnrBindingSource.EndEdit()
    20. Me.PersonenBindingSource.EndEdit()
    21. ' und von dort aus in die Access-Datenbank
    22. Me.TableAdapterManager.UpdateAll(Me.TestDBDataSet)
    23. Catch ex As Exception
    24. ' Zeigt ggf. einen Fehler an
    25. MsgBox("Fehler beim speichern der Daten in die Access-Datenbank Fehler:" & vbCrLf & vbCrLf &
    26. ex.Message)
    27. End Try
    28. End Sub
    29. Private Sub PersonenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles PersonenDataGridView.CellEnter
    30. ' Damit bei einem Wechsel innerhalb des DataGridViews gleich die ggf. vorhandenen Änderungen gesichert werden,
    31. ' wird hier erst einmal der Wert der ersten Spalte (ID) ermittelt
    32. Dim value As Object = PersonenDataGridView.Item(0, e.RowIndex).Value
    33. ' Wenn es keinen Wert gibt,
    34. If value = Nothing Or value < 0 Then
    35. ' dann passiert hier nichts mehr
    36. Exit Sub
    37. Else
    38. ' andernfalls werden die Änderungen gesichert
    39. Call Speichern()
    40. End If
    41. End Sub
    42. Private Sub TelefonnrDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles TelefonnrDataGridView.CellEnter
    43. ' Damit bei einem Wechsel innerhalb des DataGridViews gleich die ggf. vorhandenen Änderungen gesichert werden,
    44. ' wird hier erst einmal der Wert der ersten Spalte (ID) ermittelt
    45. Dim value As Object = TelefonnrDataGridView.Item(0, e.RowIndex).Value
    46. ' Wenn es keinen Wert gibt,
    47. If value = Nothing Or value < 0 Then
    48. ' auf die letzte Datenzeile gehen
    49. 'TelefonnrDataGridView.FirstDisplayedCell = TelefonnrDataGridView.Rows(TelefonnrDataGridView.RowCount - 1).Cells(0)
    50. 'Call Speichern()
    51. ' dann passiert hier nichts mehr
    52. Exit Sub
    53. Else
    54. ' andernfalls werden die Änderungen gesichert
    55. ' Call Speichern()
    56. End If
    57. End Sub
    58. Sub Aktualisieren()
    59. ' Hier soll eigentlich das passieren, was nicht klappt.
    60. ' Ich möchte nach der Eingabe eines Vornamens, dass die angezeigte ID sich auf den Wert ändert, des diese Zeile auch in der Datenbank hat.
    61. ' Aktuell steht dort immer -1 usw.
    62. End Sub
    63. Private Sub Btn_Speichern_Click(sender As Object, e As EventArgs) Handles Btn_Speichern.Click
    64. ' Ruft das Speichern der Daten in die Access-Datenbank auf
    65. Call Speichern()
    66. End Sub
    67. Private Sub Btn_Aktualisieren_Click(sender As Object, e As EventArgs) Handles Btn_Aktualisieren.Click
    68. Call Aktualisieren()
    69. End Sub
    70. Private Sub Btn_Neue_Person_Click(sender As Object, e As EventArgs) Handles Btn_Neue_Person.Click
    71. ' Für das Abfragen des Vornamens habe ich hier eine Variable deklariert,
    72. Dim NeuePerson As String
    73. ' die hier über eine Eingabebox ihren Wert bekommt.
    74. NeuePerson = InputBox("Welchen Vornamen hat die neue Person?", "", "Test")
    75. ' Gültigkeitsabfragen oder ähnliches spare ich mir hier erst einmal
    76. ' Jetzt wird die Eingabe in die Access-Datenbank eingetragen.
    77. TestDBDataSet.Personen.AddPersonenRow(NeuePerson, "")
    78. ' und die neue aktuelle letzte Zeile sowie die zweite Spalte (0 basiert) angesteuert
    79. PersonenDataGridView.CurrentCell = PersonenDataGridView(1, PersonenDataGridView.Rows.Count - 1)
    80. Try
    81. ' Die Änderungen werden jetzt gespeichert
    82. Call Speichern()
    83. ' und die ID soll hier eigentlich aktualisiert werden
    84. Call Aktualisieren()
    85. Catch ex As Exception
    86. MsgBox("Das Hinzufügen hat einen Fehler verursacht Fehler:" & vbCrLf & vbCrLf &
    87. ex.Message)
    88. End Try
    89. End Sub
    90. 'Private Sub Btn_Neue_Telefonnr_Click(sender As Object, e As EventArgs) Handles Btn_Neue_Telefonnr.Click
    91. ' ' Für das Abfragen des Vornamens habe ich hier eine Variable deklariert,
    92. ' Dim NeueTelefonnr As String
    93. ' ' die hier über eine Eingabebox ihren Wert bekommt.
    94. ' NeueTelefonnr = InputBox("Welche Vorwahl. hat die Person?", "", "12345")
    95. ' ' Gültigkeitsabfragen oder ähnliches spare ich mir hier erst einmal
    96. ' Dim PersonID As Int32
    97. ' PersonID = PersonenDataGridView.CurrentRow.Cells(1).Value
    98. ' ' Jetzt wird die Eingabe in die Access-Datenbank eingetragen.
    99. ' TestDBDataSet.Telefonnr.AddTelefonnrRow(PersonID, NeueTelefonnr, "", "")
    100. ' ' und die neue aktuelle letzte Zeile sowie die zweite Spalte (0 basiert) angesteuert
    101. ' TelefonnrDataGridView.CurrentCell = TelefonnrDataGridView(3, TelefonnrDataGridView.Rows.Count - 2)
    102. ' Try
    103. ' ' Die Änderungen werden jetzt gespeichert
    104. ' Call Speichern()
    105. ' ' und die ID soll hier eigentlich aktualisiert werden
    106. ' Call Aktualisieren()
    107. ' Catch ex As Exception
    108. ' MsgBox("Das Hinzufügen hat einen Fehler verursacht Fehler:" & vbCrLf & vbCrLf &
    109. ' ex.Message)
    110. ' End Try
    111. 'End Sub
    112. End Class

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

    Dein Fehler ist bekannt.

    ErfinderDesRades schrieb:

    Die TableAdapterManager.UpdateAll()-Methode funktioniert leider nur bei Datenbanken, die In-/Out-DbParameter unterstützen: SqlServer, MySql, SqLite,...
    Bei anderen Datenbanken schlägt Sie fehl: Access, SqlCe,...
    Der Fehlschlag betrifft "nur" neu eingefügte Datensätze, deren Primkey-Spalte autoIncrementiert. Denn solche Primkeys werden im Dataset nur provisorisch generiert, und beim Abspeichern muss von der DB abgerufen werden, welchen AutoIncrement-Wert diese als den Endgültigen generiert hat.

    Schau mal hier, das ist eine Lösung auch für Access. (Da ist auch das Zitat her)
    Hallo Haudruferzappeltnoch,

    vielen Dank für den Link. Habe mir das Ganze mal durchgelesen und doch noch viele Bahnhöfe gesehen. Werde mir heute Nachmittag mal die Zip-Dateien ansehen und mit denen ein wenig rumspielen.

    Aber schon erstaunlich, dass man für so einen kleinen Auftrag einen so riesigen Aufwand betreiben muss.

    Liegt das jetzt eigentlich an den Datenbanken oder doch er an VB.Net? Denn ohne einen eindeutigen PrimaryKey ist doch ein Programm kpl. Sinnlos. Klar kann man wahrscheinlich das Ganze umgehen, wenn man gleich XML (oder sonst was) nutzt. Aber viele arbeiten halt gerne mit Datenbanken. Da es ja das Problem auch für andere Datenbankformate gibt, ist es doch erstaunlich, dass es mit "Bordmitteln" nicht so einfach geht.

    Da mein zukünftiges Projekt doch mit x Tabellen daher kommt, will ich natürlich auch eine möglichst einfache Handhabung der Tabellennutzung haben.

    Wenn ich es mal getestet habe, dann melde ich mich noch einmal.

    @ErfinderDesRades: Auch an Dich schon einmal hier einen ganz großen Daumen hoch für Deine Mühe bzw. Arbeit.

    Ich hoffe mal, das es am Ende nur ein paar Zeilen sind, die mir die ganze Arbeit erledigen.

    Gruß
    Volker

    ...Jetzt die Frage:
    Wie komme ich direkt nach der Inputbox die ID aktualisiert zurück geliefert und kann somit auch die Telefonnr. eintragen....



    mit "SELECT @@Identity" kannst die denn Autowert ermitteln.

    hier ein Bsp.
    die Tabelle tbl_Student hat zwei felder
    StudentID = Autowert
    StudentName = Text


    VB.NET-Quellcode

    1. Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button13.Click
    2. Dim connect As String = "Provider=Microsoft.ACE.OLEDB.12.0;data source=E:\db2010.accdb"
    3. Using conn As New OleDbConnection(connect)
    4. Using cmd As New OleDb.OleDbCommand("INSERT INTO tbl_Student (StudentName) VALUES (@StudentName)", conn)
    5. cmd.Parameters.AddWithValue("@StudentName", txtName.Text)
    6. conn.Open()
    7. Try
    8. cmd.ExecuteNonQuery()
    9. Dim Newid As Integer
    10. cmd.CommandText = "SELECT @@Identity AS [id];"
    11. Newid = Convert.ToInt32(cmd.ExecuteScalar())
    12. 'txtID.Text = Newid
    13. Label1.Text = "Datensatz angelegt mit ID = " & Newid ' <-- dein Autowert
    14. Catch ex As Exception
    15. MessageBox.Show(ex.ToString())
    16. End Try
    17. End Using
    18. End Using
    19. End Sub

    Hallo Kasi, Hallo Haudruferzappeltnoch,

    @Haudruferzappeltnoch: Das ist schon erstaunlich, dass man so eine wichtige Sache vergisst und dann in all den Jahren nicht schafft, dieses Fehler irgendwie zu beheben.

    @Kasi: Auch Dir vielen Dank für Deine Antwort. Sie funktioniert super. Jetzt möchte ich aber noch, dass der neue Datensatz auch in meinem DGV (bzw. später in den Eingabefeldern) richtig angezeigt wird. Wie kann ich also den Inhalt aktualisieren?

    Vielen Dank

    Volker
    Hallo VB1963,

    vielen Dank für den Link. Der hat mich ein Stück nach vorne gebracht.

    Ich habe nun folgenden Code in meiner Form

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' **************************************************************************
    2. ' GANZ Wichtig: Auch im DataSet-Deisgner muss pro Tabellenadapter eine Ergänzung vorgenommen werden.
    3. ' Ohne diese Ergänzung wird der ID-Wert nicht aktualisiert
    4. ' Quelle: https://www.vb-paradise.de/index.php/Thread/40718-Auslesen-des-neuen-Wertes-der-Schl%C3%BCsselspalte-nach-dem-Erstellen-eines-neuen-Dat/
    5. ' https://www.vb-paradise.de/index.php/Thread/138330-DataBinding-die-Xte-ID-Wert-aktualisieren/#post1192950
    6. ' **************************************************************************
    7. Public Class Form1
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. ' Wenn ja, dann muss man ggf. die Reihenfolge ändern: Erst die Haupttabellen und dann zum Schluss die Untertabellen
    10. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Personen". Sie können sie bei Bedarf verschieben oder entfernen.
    11. Me.PersonenTableAdapter.Fill(Me.TestDBDataSet.Personen)
    12. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestDBDataSet.Telefonnr". Sie können sie bei Bedarf verschieben oder entfernen.
    13. Me.TelefonnrTableAdapter.Fill(Me.TestDBDataSet.Telefonnr)
    14. End Sub
    15. Private Sub PersonenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles PersonenDataGridView.CellEnter
    16. ' Die Änderungen werden direkt abgespeichert
    17. Call DataGridView_Zelle_verlassen(PersonenDataGridView)
    18. End Sub
    19. Private Sub PersonenDataGridView_Leave(sender As Object, e As EventArgs) Handles PersonenDataGridView.Leave
    20. ' Die Änderungen werden direkt abgespeichert
    21. Call DataGridView_Zelle_verlassen(PersonenDataGridView)
    22. End Sub
    23. Private Sub TelefonnrDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles TelefonnrDataGridView.CellEnter
    24. ' Die Änderungen werden direkt abgespeichert
    25. ' Wird benötigt, wenn man Bspw. nur einen Wert für den neuen Datensatz anlegt und ohne Enter zu drücken wo anders hingeht.
    26. Call DataGridView_Zelle_verlassen(TelefonnrDataGridView)
    27. End Sub
    28. Private Sub TelefonnrDataGridView_Leave(sender As Object, e As EventArgs) Handles TelefonnrDataGridView.Leave
    29. ' Die Änderungen werden direkt abgespeichert
    30. ' Wird benötigt, wenn man Bspw. nur einen Wert für den neuen Datensatz anlegt und ohne Enter zu drücken wo anders hingeht.
    31. Call DataGridView_Zelle_verlassen(TelefonnrDataGridView)
    32. End Sub
    33. Private Sub Btn_Speichern_Click(sender As Object, e As EventArgs) Handles Btn_Speichern.Click
    34. ' Ruft das Speichern der Daten in die Access-Datenbank auf
    35. Call Speichern()
    36. End Sub
    37. Sub Speichern()
    38. ' Ist eine extra SUB, damit diese von jeder Stelle ggf. aufgerufen werden kann.
    39. Try
    40. ' Überprüft die Eingaben
    41. Me.Validate()
    42. ' Die Änderungen werden in die DataTable geschrieben
    43. Me.TelefonnrBindingSource.EndEdit()
    44. Me.PersonenBindingSource.EndEdit()
    45. ' und von dort aus in die Access-Datenbank
    46. Me.TableAdapterManager.UpdateAll(Me.TestDBDataSet)
    47. Catch ex As Exception
    48. ' Zeigt ggf. einen Fehler an
    49. MsgBox("Fehler beim speichern der Daten in die Access-Datenbank Fehler:" & vbCrLf & vbCrLf &
    50. ex.Message)
    51. End Try
    52. End Sub
    53. Sub DataGridView_Zelle_verlassen(DGV As DataGridView)
    54. ' Wenn kein DataGridView übergeben wird,
    55. If IsNothing(DGV) Then
    56. ' dann hier gleich wieder raus
    57. Exit Sub
    58. End If
    59. ' Es wird geprüft, ob die aktuelle Zeile gleich der Zeile für Neueingaben ist
    60. If DGV.CurrentRow.Index = DGV.NewRowIndex Then
    61. ' wenn dass der Fall ist, dann passiert nichts
    62. Else
    63. ' andernfalls werden die Neueingaben gespeichert
    64. Call Speichern()
    65. End If
    66. End Sub
    67. End Class


    Anschließend habe ich noch meinen DataSet-Designer geöffnet (als die Ansicht, wo man die ganzen Tabellen und Beziehungen sieht). Dann habe ich einen Doppelklick auf den TableAdapter gemacht und folgendes Endergebnis erzeugt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Namespace TestDBDataSetTableAdapters
    3. ' Dieser Teil muss pro Tabellenadapter eingefügt werden
    4. Partial Public Class PersonenTableAdapter
    5. Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")
    6. Private Sub Adapter_RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles _adapter.RowUpdated
    7. If e.StatementType = StatementType.Insert Then
    8. _IdentityCommand.Connection = e.Command.Connection
    9. _IdentityCommand.Transaction = e.Command.Transaction
    10. e.Row(e.Row.Table.PrimaryKey(0)) = _IdentityCommand.ExecuteScalar()
    11. End If
    12. End Sub
    13. End Class
    14. ' Ende des Teil für die oben stehende Tabelle
    15. ' Hier kommt auch gleich die nächste Tabelle
    16. ' Der größte Teil wiederholt sich.
    17. Partial Public Class TelefonnrTableAdapter
    18. Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")
    19. Private Sub Adapter_RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles _adapter.RowUpdated
    20. If e.StatementType = StatementType.Insert Then
    21. _IdentityCommand.Connection = e.Command.Connection
    22. _IdentityCommand.Transaction = e.Command.Transaction
    23. e.Row(e.Row.Table.PrimaryKey(0)) = _IdentityCommand.ExecuteScalar()
    24. End If
    25. End Sub
    26. End Class
    27. End Namespace
    28. Partial Class TestDBDataSet
    29. End Class


    Ich habe meinen Code auch ein wenig kommentiert, damit ich später noch alles weiss.

    Die ersten Test sahen sehr vielversprechend aus.

    Jetzt ist halt noch eine Frage offen: Kann man den zweiten Teil eigentlich irgendwie kürzen und es für alle Tabellenadapter gelten machen? Weil bei zig Tabellen ist es ja immer das Gleiche.

    Gruß

    Volker
    Hallo zusammen,

    ich muss mich leider noch einmal hier an Euch wenden, denn der o. g. Code funktioniert so nicht in dem eigentlichen Programm. Der neue Datensatz wird bei mir nicht richtig angelegt.

    Als erstes habe ich mal die beiden Programme parallel gestartet und mit F9 direkt bei der Inputbox-Zeile gestoppt. Von dort aus ging es dann mit F11 abwechselnd Schritt für Schritt weiter.
    Desweitern habe ich auch noch Haltepunkte im DataSet bei If e.StatementType = StatementType.Insert Then gesetzt

    Folgende Unterschiede gibt es:

    1. Nach dem BindingSource.AddNew geht mein Programm in die Private Sub Artikel_Rollendes_MaterialDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_Rollendes_MaterialDataGridView.CellEnter anstelle der Private Sub Artikel_StammdatenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_StammdatenDataGridView.CellEnter

    2. Nach dem Form1.TableAdapterManager.UpdateAll(Form1.TestdatenbankDataSet) in der Speicher - Sub geht mein Programm direkt weiter. Das Testprogramm hingegen geht in die DataSet und e.StatementType ist hier gleich 1 StatementType.Insert.

    3. Beim zweiten Speichern (also nach dem AddNew) geht mein Programm zwar in den DataSet-Code, aber dort ist e.StatementType = 2 (also Update)

    Meine beiden aktuell genutzten Tabellen sind mit einer "Nur Beziehung" verbunden. In meinem Testprogramm hingegen als "Sowohl Beziehungs- als auch Fremdschlüsseleinschränkung". Aber daran kann es nicht liegen, denn wenn ich mein Testprogramm auch nur als "Nur Beziehung" einstelle, funktioniert dies auch immer noch.

    Alle ID Felder und auch das Verknüpfungsfeld sind Int32-Felder.

    Meine zweite Tabelle ist im DataGridView mit der Untertabelle der Haupttabelle verbunden und nicht direkt mit der Untertabelle. Daher ändern sich auch ordentlich die Daten der Untertabelle, wenn in der Haupttabelle sich der Datensatz ändert. Somit müsste hier auch alles richtig sein.

    Da ich in beiden Projekten nichts weiter im DataSet eingestellt habe (außer natürlich den TableAdapter-Code eingefügt habe) sehe ich hier auch nicht das Problem. Mein Hauptprogramm besitzt im Dataset natürlich schon alle in Frage kommenden Tabellen, von denen ich aktuell aber nur 2 benutze. Das dürfte doch eigentlich auch egal sein.

    Da ich leider jetzt nicht mehr weiter weis, hoffe ich, dass Ihr mir helfen könnt.

    Über einige Antworten würde ich mich sehr freuen.

    Gruß
    Volker

    Hier mal meine DataGridView-Subs

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Artikel_StammdatenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_StammdatenDataGridView.CellEnter
    2. ' Die Änderungen werden direkt abgespeichert
    3. Call DataGridView_Zelle_verlassen(Artikel_StammdatenDataGridView, Welche_Daten_ENUM.Hauptformular)
    4. End Sub
    5. Private Sub Artikel_StammdatenDataGridView_Leave(sender As Object, e As EventArgs) Handles Artikel_StammdatenDataGridView.Leave
    6. ' Die Änderungen werden direkt abgespeichert
    7. Call DataGridView_Zelle_verlassen(Artikel_StammdatenDataGridView, Welche_Daten_ENUM.Hauptformular)
    8. End Sub
    9. Private Sub Artikel_Rollendes_MaterialDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_Rollendes_MaterialDataGridView.CellEnter
    10. ' Die Änderungen werden direkt abgespeichert
    11. Call DataGridView_Zelle_verlassen(Artikel_Rollendes_MaterialDataGridView, Welche_Daten_ENUM.Hauptformular)
    12. 'Call Rollende_Artikel_aktualisieren()
    13. End Sub
    14. Private Sub Artikel_Rollendes_MaterialDataGridView_Leave(sender As Object, e As EventArgs) Handles Artikel_Rollendes_MaterialDataGridView.Leave
    15. ' Die Änderungen werden direkt abgespeichert
    16. Call DataGridView_Zelle_verlassen(Artikel_Rollendes_MaterialDataGridView, Welche_Daten_ENUM.Hauptformular)
    17. End Sub

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

    Hallo Haudruferzappeltnoch,

    Hier nun mal mein Code, der aktuell benutzt wird

    Form1
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' **************************************************************************
    2. ' GANZ Wichtig: Auch im DataSet-Deisgner muss pro Tabellenadapter eine Ergänzung vorgenommen werden.
    3. ' Ohne diese Ergänzung wird der ID-Wert nicht aktualisiert
    4. ' Quelle: https://www.vb-paradise.de/index.php/Thread/40718-Auslesen-des-neuen-Wertes-der-Schl%C3%BCsselspalte-nach-dem-Erstellen-eines-neuen-Dat/
    5. ' https://www.vb-paradise.de/index.php/Thread/138330-DataBinding-die-Xte-ID-Wert-aktualisieren/#post1192950
    6. ' **************************************************************************
    7. Imports System.ComponentModel
    8. Imports System.Data.Common
    9. Imports System.Data.OleDb
    10. Imports System.IO
    11. Imports System.Net.WebRequestMethods
    12. Imports System.Windows.Forms.VisualStyles.VisualStyleElement
    13. #Region "Programmstart"
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. ' Call Tabellenbeziehungen_erstellen()
    16. ' Damit die Load-Sub nicht so viel Inhalt hat, werden die Tabelleninhalte über eine SUb eingelesen
    17. Call Tabelleninhalt_laden(Welche_Daten_ENUM.Hauptformular)
    18. '' Ein paar Grundeinstellungen vornehmen
    19. 'Call Steuerelemente_einstellen(Welche_Daten_ENUM.Hauptformular)
    20. 'Call Interne_Bilder_zuweisen(Welche_Daten_ENUM.Hauptformular)
    21. 'Call Stammdaten_Bilder_aktualisieren()
    22. 'Call Rollende_Artikel_aktualisieren()
    23. 'Call DGV_Ueberschriften_aendern(Artikel_StammdatenDataGridView)
    24. End Sub
    25. #End Region
    26. #Region "DataGridView Aktionen"
    27. Private Sub Artikel_StammdatenDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_StammdatenDataGridView.CellEnter
    28. ' Die Änderungen werden direkt abgespeichert
    29. Call DataGridView_Zelle_verlassen(Artikel_StammdatenDataGridView, Welche_Daten_ENUM.Hauptformular)
    30. End Sub
    31. 'Private Sub Artikel_StammdatenDataGridView_Leave(sender As Object, e As EventArgs) Handles Artikel_StammdatenDataGridView.Leave
    32. ' ' Die Änderungen werden direkt abgespeichert
    33. ' Call DataGridView_Zelle_verlassen(Artikel_StammdatenDataGridView, Welche_Daten_ENUM.Hauptformular)
    34. 'End Sub
    35. ''Private Sub Artikel_Rollendes_MaterialDataGridView_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles Artikel_Rollendes_MaterialDataGridView.CellEnter
    36. '' ' Die Änderungen werden direkt abgespeichert
    37. '' Call DataGridView_Zelle_verlassen(Artikel_Rollendes_MaterialDataGridView, Welche_Daten_ENUM.Hauptformular)
    38. '' 'Call Rollende_Artikel_aktualisieren()
    39. ''End Sub
    40. 'Private Sub Artikel_Rollendes_MaterialDataGridView_Leave(sender As Object, e As EventArgs) Handles Artikel_Rollendes_MaterialDataGridView.Leave
    41. ' ' Die Änderungen werden direkt abgespeichert
    42. ' Call DataGridView_Zelle_verlassen(Artikel_Rollendes_MaterialDataGridView, Welche_Daten_ENUM.Hauptformular)
    43. 'End Sub
    44. #End Region
    45. #Region "Datensatznavigation"
    46. Private Sub PBox_DS_Erster_Click(sender As Object, e As EventArgs) Handles PBox_DS_Erster.Click
    47. Artikel_StammdatenBindingSource.MoveFirst()
    48. End Sub
    49. Private Sub PBox_DS_Vorheriger_Click(sender As Object, e As EventArgs) Handles PBox_DS_Vorheriger.Click
    50. Artikel_StammdatenBindingSource.MovePrevious()
    51. End Sub
    52. Private Sub PBox_DS_Naechster_Click(sender As Object, e As EventArgs) Handles PBox_DS_Naechster.Click
    53. Artikel_StammdatenBindingSource.MoveNext()
    54. End Sub
    55. Private Sub PBox_DS_Letzter_Click(sender As Object, e As EventArgs) Handles PBox_DS_Letzter.Click
    56. Artikel_StammdatenBindingSource.MoveLast()
    57. End Sub
    58. Private Sub PBox_DS_Speichern_Click(sender As Object, e As EventArgs) Handles PBox_DS_Speichern.Click
    59. ' Zuerst einmal ggf. eine Datenänderung abspeichern
    60. Call Datensatzaenderung_abspeichern(Welche_Daten_ENUM.Hauptformular)
    61. End Sub
    62. Private Sub PBox_DS_Neu_Click(sender As Object, e As EventArgs) Handles PBox_DS_Neu.Click
    63. ' Für das Abfragen des Vornamens habe ich hier eine Variable deklariert,
    64. Dim NeueArtikelNr As String
    65. ' die hier über eine Eingabebox ihren Wert bekommt.
    66. NeueArtikelNr = InputBox("Welche Artikelnr. wollen Sie anlegen?", "", "Test")
    67. ' Zur Sicherheit wird jetzt noch einmal nachgefragt, ob die Eingabe korrekt ist
    68. If MsgBox("Sie sind gerade dabei, einen neuen Datensatz anzulegen." & vbCrLf & vbCrLf &
    69. "Ihre Eingabe war:" & vbCrLf & vbCrLf &
    70. NeueArtikelNr & vbCrLf & vbCrLf &
    71. "Ist diese Eingabe richtig?", MsgBoxStyle.DefaultButton2 + MsgBoxStyle.YesNo, "Neue Artikelnr. anlegen") = vbNo Then
    72. ' wenn nicht, dann wird das Anlegen eines neuen Datensatzes hier abgebrochen
    73. Exit Sub
    74. Else
    75. ' andernfalls wird die Eingabe als neuer Datensatz angelegt
    76. ' Einen neuen Datensatz hinzufügen.
    77. ' Durch den restlichen Code wird auch sofort die ID hinzugefügt.
    78. Artikel_StammdatenBindingSource.AddNew()
    79. ' und den Wert zuweisen
    80. Me.Artikel_Stammdaten_ArtikelnrTextBox.Text = NeuePerson
    81. ' Den neuen Datensatz auch in die Datenbank übernehmen
    82. Call Datensatzaenderung_abspeichern(Welche_Daten_ENUM.Hauptformular)
    83. ' Jetzt noch das erste Eingabefeld ansteuern.
    84. Me.Artikel_Stammdaten_ArtikelnrTextBox.Select()
    85. End If
    86. End Sub
    87. Private Sub PBox_DS_Loeschen_Click(sender As Object, e As EventArgs) Handles PBox_DS_Loeschen.Click
    88. ' Bevor der aktuelle Datensatz gelöscht wird, muss noch eine Sicherheitsabfrage beantwortet werden
    89. If MsgBox("Sie sind gerade dabei, den Datensatz" & vbCrLf & vbCrLf &
    90. Me.Artikel_Stammdaten_ArtikelnrTextBox.Text & " " & Me.Artikel_Stammdaten_BezeichnungTextBox.Text & vbCrLf & vbCrLf &
    91. "zu löschen." & vbCrLf & vbCrLf &
    92. "Wenn Sie jetzt auf Ja drücken, dann sind auch ggf. alle anderen Daten in den untergeordneten Tabellen nicht mehr nutzbar bzw. vorhanden.", MsgBoxStyle.DefaultButton2 + MsgBoxStyle.YesNo) = MsgBoxResult.No Then
    93. ' wurde diese verneint, dann wird hier abgebrochen und alles bleibt so wie gehabt.
    94. Exit Sub
    95. Else
    96. ' andernfalls wird der aktuelle Datensatz gelöscht
    97. ' Durch die eingestellten Beziehungen der einzelnen Tabellen, werden auch hier die Inhalte der Untertabellen mit gelöscht.
    98. ' Dadurch entstehen keine verweisten Datensätze und die Datenbank wird nicht zugemüllt.
    99. Artikel_StammdatenBindingSource.RemoveCurrent()
    100. End If
    101. End Sub
    102. #End Region


    Modul Tabellenzugriffe
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub Tabelleninhalt_laden(Welche_Daten As Welche_Daten_ENUM)
    2. Select Case Welche_Daten
    3. Case Welche_Daten_ENUM.Hauptformular
    4. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestdatenbankDataSet.Artikel_Stammdaten". Sie können sie bei Bedarf verschieben oder entfernen.
    5. Form1.Artikel_StammdatenTableAdapter.Fill(Form1.TestdatenbankDataSet.Artikel_Stammdaten)
    6. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestdatenbankDataSet.Artikel_Rollendes_Material". Sie können sie bei Bedarf verschieben oder entfernen.
    7. Form1.Artikel_Rollendes_MaterialTableAdapter.Fill(Form1.TestdatenbankDataSet.Artikel_Rollendes_Material)
    8. ' Das Anfügen von neuen Datensätzen und das Löschen von Datensätzen über das DataGridView verhindern. Es können also nur Daten geändert und gelöscht werden.
    9. ' Das Hinzufügen und das Löschen passiert über einen eigenen Button
    10. Form1.Artikel_StammdatenDataGridView.AllowUserToAddRows = False
    11. Form1.Artikel_StammdatenDataGridView.AllowUserToDeleteRows = False
    12. Form1.Artikel_Rollendes_MaterialDataGridView.AllowUserToAddRows = False
    13. Form1.Artikel_Rollendes_MaterialDataGridView.AllowUserToDeleteRows = False
    14. Case Welche_Daten_ENUM.Form_UT_Hersteller
    15. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestdatenbankDataSet.UT_Hersteller". Sie können sie bei Bedarf verschieben oder entfernen.
    16. Form_UT_Hersteller.UT_HerstellerTableAdapter.Fill(Form_UT_Hersteller.TestdatenbankDataSet.UT_Hersteller)
    17. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestdatenbankDataSet.UT_Anrede". Sie können sie bei Bedarf verschieben oder entfernen.
    18. Form_UT_Hersteller.UT_AnredeTableAdapter.Fill(Form_UT_Hersteller.TestdatenbankDataSet.UT_Anrede)
    19. 'TODO: Diese Codezeile lädt Daten in die Tabelle "TestdatenbankDataSet.UT_Laender". Sie können sie bei Bedarf verschieben oder entfernen.
    20. Form_UT_Hersteller.UT_LaenderTableAdapter.Fill(Form_UT_Hersteller.TestdatenbankDataSet.UT_Laender)
    21. ' Das Anfügen von neuen Datensätzen und das Löschen von Datensätzen über das DataGridView verhindern. Es können also nur Daten geändert und gelöscht werden.
    22. ' Das Hinzufügen und das Löschen passiert über einen eigenen Button
    23. Form_UT_Hersteller.UT_HerstellerDataGridView.AllowUserToAddRows = False
    24. Form_UT_Hersteller.UT_HerstellerDataGridView.AllowUserToDeleteRows = False
    25. End Select
    26. Call Datenfelder_zuweisen(Welche_Daten)
    27. End Sub


    Modul Tabellenfelder_binden
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Data
    2. Module Tabellenfelder_binden
    3. Sub Datenfelder_zuweisen(Welche_Daten As Welche_Daten_ENUM)
    4. Select Case Welche_Daten
    5. Case Welche_Daten_ENUM.Hauptformular
    6. ' Stammdaten
    7. Call Datenfeld_zuweisen("Artikel_Stammdaten_ArtikelnrTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    8. Call Datenfeld_zuweisen("Artikel_Stammdaten_Artikelnr_AltTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    9. Call Datenfeld_zuweisen("Artikel_Stammdaten_Angelegt_amTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    10. Call Datenfeld_zuweisen("Artikel_Stammdaten_Geaendert_amTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    11. Call Datenfeld_zuweisen("Artikel_Stammdaten_BezeichnungTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    12. Call Datenfeld_zuweisen("TBox_Barcodeanzeige", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    13. Call Datenfeld_zuweisen("Artikel_Stammdaten_BarcodenrTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    14. Call Datenfeld_zuweisen("Artikel_Stammdaten_Barcodeaufkleber_OriginalbezeichnungTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    15. Call Datenfeld_zuweisen("Artikel_Stammdaten_ISBNNummerTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    16. Call Datenfeld_zuweisen("Artikel_Stammdaten_QRCode_InhaltTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    17. Call Datenfeld_zuweisen("Artikel_Stammdaten_Artikelnr_gesichertCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    18. Call Datenfeld_zuweisen("Artikel_Stammdaten_Besteht_aus_mehreren_TeilenCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    19. Call Datenfeld_zuweisen("Artikel_Stammdaten_Barcodeaufkleber_druckenCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    20. Call Datenfeld_zuweisen("Artikel_Stammdaten_Aufkleber_neu_druckenCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    21. Call Datenfeld_zuweisen("Artikel_Stammdaten_Aufkleber_TrainsafeCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    22. Call Datenfeld_zuweisen("Artikel_Stammdaten_Wunschliste_anzeigenCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    23. Call Datenfeld_zuweisen("Artikel_Stammdaten_VerkauftCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    24. Call Datenfeld_zuweisen("Artikel_Stammdaten_NachkontrollierenCheckBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    25. Call Datenfeld_zuweisen("Artikel_Stammdaten_Schnellinfo_BaureiheTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    26. Call Datenfeld_zuweisen("Artikel_Stammdaten_Schnellinfo_BetriebsnrTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    27. Call Datenfeld_zuweisen("Artikel_Stammdaten_Schnellinfo_DekoderAdresseTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    28. ' Stammdaten - Verdeckte Felder
    29. Call Datenfeld_zuweisen("Artikel_Stammdaten_UT_EingabemaskenIDTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    30. Call Datenfeld_zuweisen("Artikel_Stammdaten_UT_SpurweitenIDTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    31. Call Datenfeld_zuweisen("Artikel_Stammdaten_UT_LaenderIDTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    32. Call Datenfeld_zuweisen("Artikel_Stammdaten_UT_ZustandIDTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    33. Call Datenfeld_zuweisen("Artikel_Stammdaten_Schnellinfo_BildpfadTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    34. Call Datenfeld_zuweisen("IDTextBox", Welche_Daten_ENUM.Hauptformular_Stammdaten, Form1.Panel_Stammdaten)
    35. ' Rollendes Material
    36. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_BahngesellschaftenIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    37. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_HerkunftsgesellschaftenIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    38. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_HerstellerIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    39. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_HauptrubrikIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    40. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_Unterrubrik1IDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    41. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_Unterrubrik2IDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    42. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_BaureiheTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    43. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_BetriebsnrTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    44. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_RevisionsdatumTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    45. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_UT_EpochenIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    46. ' Rollendes Material - Verdeckte Felder
    47. Call Datenfeld_zuweisen("Artikel_Rollendes_Material_Artikel_StammdatenIDTextBox", Welche_Daten_ENUM.Hauptformular_RollendesMaterial, Form1.Panel_Daten)
    48. Case Welche_Daten_ENUM.Form_UT_Hersteller
    49. ' Grunddaten
    50. Call Datenfeld_zuweisen("UT_Hersteller_BezeichnungTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    51. Call Datenfeld_zuweisen("UT_Hersteller_LangbezeichnungTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    52. Call Datenfeld_zuweisen("UT_Hersteller_VornameTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    53. Call Datenfeld_zuweisen("UT_Hersteller_NachnameTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    54. Call Datenfeld_zuweisen("UT_Hersteller_AkademischerGradTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    55. Call Datenfeld_zuweisen("UT_Hersteller_AbteilungTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    56. Call Datenfeld_zuweisen("UT_Hersteller_StrasseTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    57. Call Datenfeld_zuweisen("UT_Hersteller_PLZTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    58. Call Datenfeld_zuweisen("UT_Hersteller_OrtTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    59. Call Datenfeld_zuweisen("UT_Hersteller_PLZPostfachTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    60. Call Datenfeld_zuweisen("UT_Hersteller_PostfachTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    61. Call Datenfeld_zuweisen("UT_Hersteller_BundeslandTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Grunddaten)
    62. ' Kommunikation
    63. Call Datenfeld_zuweisen("UT_Hersteller_EMailAdresseTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Kommunikation)
    64. Call Datenfeld_zuweisen("UT_Hersteller_VorwahlTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Kommunikation)
    65. Call Datenfeld_zuweisen("UT_Hersteller_DurchwahlTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Kommunikation)
    66. Call Datenfeld_zuweisen("UT_Hersteller_FaxTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Kommunikation)
    67. Call Datenfeld_zuweisen("UT_Hersteller_HandyTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Kommunikation)
    68. ' Interene Daten
    69. Call Datenfeld_zuweisen("UT_Hersteller_EingabemaskenTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Interene_Daten)
    70. Call Datenfeld_zuweisen("UT_Hersteller_DateipfadTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Interene_Daten)
    71. Call Datenfeld_zuweisen("UT_Hersteller_UT_VerzeichnisseIDTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Interene_Daten)
    72. Call Datenfeld_zuweisen("UT_Hersteller_QRCodeTextTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Interene_Daten)
    73. ' Zahlungsinformationen
    74. Call Datenfeld_zuweisen("UT_Hersteller_IBANTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Zahlungsinformationen)
    75. Call Datenfeld_zuweisen("UT_Hersteller_BICTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Zahlungsinformationen)
    76. Call Datenfeld_zuweisen("UT_Hersteller_KontonummerTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Zahlungsinformationen)
    77. Call Datenfeld_zuweisen("UT_Hersteller_BLZTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Zahlungsinformationen)
    78. ' Shopimformationen
    79. Call Datenfeld_zuweisen("UT_Hersteller_WEBSeiteTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    80. Call Datenfeld_zuweisen("UT_Hersteller_OeffnungszeitenTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    81. Call Datenfeld_zuweisen("UT_Hersteller_OnlineShopCheckBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    82. Call Datenfeld_zuweisen("UT_Hersteller_AnmeldenameTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    83. Call Datenfeld_zuweisen("UT_Hersteller_PasswortTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    84. Call Datenfeld_zuweisen("UT_Hersteller_Anmelde_Email_AdresseTextBox", Welche_Daten_ENUM.Form_UT_Hersteller, Form_UT_Hersteller.GBox_Shopimformationen)
    85. End Select
    86. End Sub
    87. Sub Datenfeld_zuweisen(Feldname As String, Welche_Daten As Welche_Daten_ENUM, Steuerelemt As Control)
    88. Dim ControlArt As String
    89. If InStr(Feldname, "TextBox") > 0 Then ControlArt = "TextBox"
    90. If InStr(Feldname, "CheckBox") > 0 Then ControlArt = "CheckBox"
    91. Select Case Welche_Daten
    92. Case Welche_Daten_ENUM.Hauptformular_Stammdaten
    93. Select Case ControlArt
    94. Case "TextBox"
    95. Steuerelemt.Controls(Feldname).DataBindings.Add("Text",
    96. Form1.Artikel_StammdatenBindingSource,
    97. Replace(Feldname, ControlArt, ""),
    98. False,
    99. DataSourceUpdateMode.OnPropertyChanged)
    100. Case "CheckBox"
    101. Steuerelemt.Controls(Feldname).DataBindings.Add("Checked",
    102. Form1.Artikel_StammdatenBindingSource,
    103. Replace(Feldname, ControlArt, ""),
    104. False,
    105. DataSourceUpdateMode.OnPropertyChanged)
    106. End Select
    107. Case Welche_Daten_ENUM.Hauptformular_RollendesMaterial
    108. Select Case ControlArt
    109. Case "TextBox"
    110. Steuerelemt.Controls(Feldname).DataBindings.Add("Text",
    111. Form1.Artikel_Rollendes_MaterialBindingSource,
    112. Replace(Feldname, ControlArt, ""),
    113. False,
    114. DataSourceUpdateMode.OnPropertyChanged)
    115. Case "CheckBox"
    116. Steuerelemt.Controls(Feldname).DataBindings.Add("Checked",
    117. Form1.Artikel_Rollendes_MaterialBindingSource,
    118. Replace(Feldname, ControlArt, ""),
    119. False,
    120. DataSourceUpdateMode.OnPropertyChanged)
    121. End Select
    122. Case Welche_Daten_ENUM.Form_UT_Hersteller
    123. Select Case ControlArt
    124. Case "TextBox"
    125. Steuerelemt.Controls(Feldname).DataBindings.Add("Text",
    126. Form_UT_Hersteller.UT_HerstellerBindingSource,
    127. Replace(Feldname, ControlArt, ""),
    128. False,
    129. DataSourceUpdateMode.OnPropertyChanged)
    130. Case "CheckBox"
    131. Steuerelemt.Controls(Feldname).DataBindings.Add("Checked",
    132. Form_UT_Hersteller.UT_HerstellerBindingSource,
    133. Replace(Feldname, ControlArt, ""),
    134. False,
    135. DataSourceUpdateMode.OnPropertyChanged)
    136. End Select
    137. End Select
    138. End Sub
    139. End Module


    DataSet-Code
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Namespace TestdatenbankDataSetTableAdapters
    3. Partial Public Class Artikel_Rollendes_MaterialTableAdapter
    4. Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")
    5. Private Sub Adapter_RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles _adapter.RowUpdated
    6. If e.StatementType = StatementType.Insert Then
    7. _IdentityCommand.Connection = e.Command.Connection
    8. _IdentityCommand.Transaction = e.Command.Transaction
    9. e.Row(e.Row.Table.PrimaryKey(0)) = _IdentityCommand.ExecuteScalar()
    10. End If
    11. End Sub
    12. End Class
    13. Partial Public Class Artikel_StammdatenTableAdapter
    14. Private _IdentityCommand As New OleDbCommand("SELECT @@IDENTITY")
    15. Private Sub Adapter_RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) Handles _adapter.RowUpdated
    16. If e.StatementType = StatementType.Insert Then
    17. _IdentityCommand.Connection = e.Command.Connection
    18. _IdentityCommand.Transaction = e.Command.Transaction
    19. e.Row(e.Row.Table.PrimaryKey(0)) = _IdentityCommand.ExecuteScalar()
    20. End If
    21. End Sub
    22. End Class
    23. End Namespace
    24. Partial Class TestdatenbankDataSet
    25. End Class


    Mein Hauptprogramm geht in der Zeile 116 (Form1) einfach weiter. Mein Testprogramm springt in die DataGridView_CellEnter-Sub und von dort aus nach dem TableAdapterManager.UpdateAll in den DataSet-Code mit Insert und beim zweiten Speichern natürlich im Update.

    Ich hoffe, dass ich jetzt nichts vergessen habe und Du bzw. Ihr mir helfen könnt.

    Gruß
    Volker

    _________________________________________________________________________________________________________________________

    Hallo Zusammen,

    habe gerade selbst die Lösung gefunden. (Hier habe ich den Denkanstoss her: vbarchiv.net/forum/id22_i48458…e-funktioniert-nicht.html)

    Den Code habe ich erst einmal als erstes in das Form_Load gepackt und dann getestet.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Alle Ja/Nein Felder auf einen Defaultwert setzen
    2. ' Ohne diese Grundeinstellung klappt später das Hinzufügen nicht.
    3. For Each table As DataTable In TestdatenbankDataSet.Tables
    4. For Each column As DataColumn In table.Columns
    5. ' Überprüfen, ob die Spalte vom Typ Boolean ist
    6. If column.DataType Is GetType(Boolean) Then
    7. ' Setze den Default-Wert auf False
    8. column.DefaultValue = False
    9. End If
    10. Next
    11. Next


    Plötzlich läuft es.

    Da ich natürlich nicht an solch eine Kleinigkeit gedacht habe, habe ich leider auch nicht erwähnt, dass mein Testprojekt kein solches Feld hat. Daher hat dieses Projekt auch keine Probleme damit. Mein Hauptprojekt hat aber diverse Tabellen mit diversen Ja/Nein-Feldern und somit habe ich mich jetzt entschlossen, diesen schnellen und einfachen Weg zu gehen. Klar kann man jetzt natürlich auch alle in Frage kommenden Felder im DataSet umstellen, aber so geht es am schnellsten.

    NOCH EINE FRAGE: Aber eine ganz wichtige Frage habe ich trotzdem noch

    Kann ich den DataSet Code irgendwie für alle Tabellen nur einmal einfügen oder muss ich tatsächlich alle Tabellen einzeln so eintragen?

    Vielen Dank trotzdem.

    Volker

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Volker Bunge“ ()

    Im DataSet-Designer kann man Default-Werte für die Spalten direkt vergeben. Das mache ich aber selten, deswegen weiß ich nicht hundertprozentig, wie das DataSet damit umgeht, also wann genau der Default-Wert auch geschrieben wird. Müsstest mal ausprobieren

    Ansonsten muss ich auch sagen benutze ich meist DGV und BindingSource in einer Weise, das alles automatisch läuft.

    VB.NET-Quellcode

    1. Private Sub PBox_DS_Naechster_Click(sender As Object, e As EventArgs) Handles PBox_DS_Naechster.Click
    2. Artikel_StammdatenBindingSource.MoveNext()
    3. End Sub
    Warum steuerst du das DGV mit Buttons?
    Hallo Haudruferzappeltnoch,

    das Steuern mit Buttons ist er so was optisches.

    Mein DataGridView ist recht flach in der Höhe, da darunter noch viel Platz gebraucht wird. Klar, könnte man die Daten auch über das DataGridView wechseln, aber spätestens der erste und letzte Datensatz geht über Buttons schneller. Evtl. wird das DGV auch noch ein und ausgeblendet und dann bräuchte ich die Buttons auf jeden Fall.

    Was aber auch noch kommen soll, ist ein Filtermöglichkeit über alle Spalten bzw. über eine vorher festzulegende Spalte. Hierzu wollte ich wahrscheinlich einfach passende Textboxen über oder unter die jeweiligen Spalten packen und man kann dann seinen Filter einfach festlegen. Soweit bin ich aber noch nicht, sondern dass ist erst einmal eine Idee. Mal sehen, wie ich es tatsächlich umsetze. Wenn es geht, dann wäre es cool, wenn ich passende Controls per Code erzeuge, die dann so ausgerichtet sind in der Breite bzw. mittigen Position, wie im DGV.

    Hast Du evtl. noch eine Lösung für meine zusätzliche Frage bzgl. Vereinfachung des DataSet-Codes? Das würde mich gerade auch noch sehr interessieren. Müsste ich tatsächlich für jede Tabelle einen solchen Code einfügen, dann wäre der Optik hier wohl recht schnell ein Minus zu geben. Vor allem deswegen, da der eigentliche Code ja immer der selbe ist.

    Noch einen schönen Sonntag.

    Volker
    Mir fehlt da glaub auch bisschen Kontext zu.
    Aber das dreht sich denke ich um die Problematik mit Access und AutoIncrement Spalten oder?

    Generell braucht jede Tabelle ihren Adapter, deswegen ist eine AdapterManager Klasse entscheidend.
    Da hatte man dich schon drauf hingewiesen auf die DbPersistance von EdR, die behebt auch das AutoIncrement Problem, benutzt du die schon?