Datengebundene Textbox als Eingabefeld

  • VB.NET

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

    Datengebundene Textbox als Eingabefeld

    Tach auch,

    ich such mir ein Wolf und sehe scheinbar die Lösung nicht. Bin wohl in der Denkweise noch zu sehr in der MS Accesswelt.
    Was ich suche: In einem Formular die Textfelder an eine Datenbank anbinden, was auch Funktioniert über:

    (Beispiel für Tabelle tblmitarbeiter Inhalt Nachname)
    Eigenschaften --> DataBinding --> Text --> "TblmitarbeiterBindingSource - Nachname"

    Nun war ich scheinbar so Naiv, weil ich es von Access ja auch so kenne, wenn ein Feld an die Datenbank gebunden ist kann ich in diesem Feld direkt die Daten in der Datenbank ändern.
    Ei das ist hier wohl alles etwas anders ;(
    Evtl. fehlen mir auch nur die richtige Suchbegriffe um es zu finden.

    Kurz gefasst. Ich möchte über die Textboxen (oder was auch immer) Daten verändern können. Wie macht man denn so was?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    jo, machst du ganz richtig.
    Der Witz ist nur, dass beim EditVorgang das DataView in den EditMode geht.
    Welcher automatisch beendet wird, wenn der nächste Datensatz ausgewählt wird.

    Der EditMode ist eine Art Zwischenzustand, wo Änderungen erst noch vorgemerkt werden.
    So kann man am selben Datensatz mehrere Properties ändern, ohne dass es gleich ins Dataset geschrieben wird.
    Weiters kann man so die Bearbeitung eines ganzen Datensatzes auch insgesamt canceln.

    Jedenfalls - wenn du deine Bearbeitung ins Dataset übernehmen möchtest, ohne einen anderen Datensatz auszuwählen, dann musste BindingSource.EndEdit() aufrufen.
    (Und zum canceln BindingSource.CancelEdit)
    Hallöschen,

    immerhin habe ich schon mal die richtige Richtung.

    mein Quellcode:

    VB.NET-Quellcode

    1. Private Sub btnEnde_Click(sender As Object, e As EventArgs) Handles btnEnde.Click
    2. Application.Exit()
    3. End Sub
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DatenpvDataSet.tblmitarbeiter".
    6. 'Sie können sie bei Bedarf verschieben oder entfernen.
    7. Me.TblmitarbeiterTableAdapter1.Fill(Me.DatenpvDataSet.tblmitarbeiter)
    8. End Sub
    9. Private Sub txtVorname_Leave(sender As Object, e As EventArgs) Handles txtVorname.Leave
    10. TblmitarbeiterBindingSource.EndEdit()
    11. MsgBox("Wert aus Vorname: " & txtVorname.Text.ToString)
    12. End Sub
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. TblmitarbeiterBindingSource.EndEdit()
    15. End Sub


    Jedoch weder beim klicken auf den Button oder beim verlassen von der Textbox wird es gespeichert. Beim erneuten öffnen der Form stehen wieder die alte Werte.
    Hat das evtl. damit zu tun? Verhalten von Textboxen nach Return
    Oder habe ich das BindingSource.EndEdit() einfach nur total falsch gesetzt?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    axso .... hatte gehofft das wäre es.

    habe es nun so gelöst:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub BtnEnde_Click(sender As Object, e As EventArgs) Handles BtnEnde.Click
    3. Application.Exit()
    4. End Sub
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DatenpvDataSet.tblmitarbeiter".
    7. 'Sie können sie bei Bedarf verschieben oder entfernen.
    8. Me.TblmitarbeiterTableAdapter1.Fill(Me.DatenpvDataSet.tblmitarbeiter)
    9. End Sub
    10. Private Sub SubDatenspeichern(sender As Object, e As EventArgs)
    11. Handles TxtVorname.Leave, TXTStrasse.Leave, TXTplz.Leave, TXTOrt.Leave,
    12. TxtNachname.Leave
    13. Try
    14. Me.Validate()
    15. ' ####### EndEdit schreibt die Daten ins DataSet nicht in die Datenbank
    16. Me.TblmitarbeiterBindingSource.EndEdit()
    17. ' ####### Der DataAdapter schreibt nun die Daten in die Datenbank
    18. Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)
    19. MsgBox("Update successful")
    20. Catch ex As Exception
    21. MsgBox("Update failed")
    22. End Try
    23. End Sub
    24. End Class


    Scheint zu funktionieren.
    Für die Textboxen habe ich in den Eigenschaften für leave jeweils die SubDatenspeichern eingetragen.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lupusverlach“ () aus folgendem Grund: Hatte eine Frage gestellt die ich dann selbst gelöst habe und nun sieht es so aus

    Jo, schwupps neue Fragen dazu :)

    Löschen geht auch

    VB.NET-Quellcode

    1. Private Sub BTNLoeschen_Click(sender As Object, e As EventArgs) Handles BTNLoeschen.Click
    2. Me.TblmitarbeiterBindingSource.RemoveCurrent()
    3. Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)
    4. End Sub


    Was nicht geht, ein neuer Datensatz. Also geht nur halb.

    VB.NET-Quellcode

    1. Private Sub BTNNeu_Click(sender As Object, e As EventArgs) Handles BtnNeu.Click
    2. Me.TblmitarbeiterBindingSource.AddNew()
    3. Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)
    4. End Sub


    Dann kann ich in der ersten Textbox zwar etwas eingeben, doch wenn diese verlassen wird (Code eins weiter oben), kommt dann eine Fehlermeldung.

    System.Data.DBConcurrencyException: Parallelitätsverletzung:
    Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

    Stehen bleibt er an der Stelle "Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)"
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    VB.NET-Quellcode

    1. Private Sub BTNNeu_Click(sender As Object, e As EventArgs) Handles BtnNeu.Click
    2. Me.TblmitarbeiterBindingSource.AddNew()
    3. TXTLastUser.Text = Environ("USERNAME")
    4. TXTNeuanlage.Text = Today
    5. Me.TblmitarbeiterBindingSource.EndEdit()
    6. Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)
    7. Me.TblmitarbeiterTableAdapter1.Fill(DatenpvDataSet.tblmitarbeiter)
    8. Me.TblmitarbeiterBindingSource.MoveLast()
    9. End Sub


    So funktioniert es zwar, aber mein Bauchgefühl sagt es ist nicht unbedingt richtig.
    So lange nur ich Daten eingebe läuft das bestimmt so auch prima.
    Wenn aber mehrere Leute Daten eingeben, passiert es dann nicht das ich evtl. den Datensatz eines anderen bearbeite?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    zeilen #7,#8 sind natürlich ärgerlich.
    Also dass man die ganze Tabelle neu laden muss, und dabei auch die selektierte Zeile verliert, nur um einen popeligen Datensatz zuzufügen - ist doch grotesk.
    Aber ist leider unter den gegebenen Umständen nötig, weil die Datenbank den PrimKey des neuen Datensatzes neu festlegt - und diese Info muss zurücktransportiert werden.
    Abr wie gesagt, grotesk, dafür die ganze Tabelle neu einzulesen.

    Um also ernsthaft mit einer Datenbank zu arbeiten muss man andere Geschütze auffahren als diese erbärmlichen generierten TableAdapter: Dataset->Db

    Lupusverlach schrieb:

    Wenn aber mehrere Leute Daten eingeben, passiert es dann nicht das ich evtl. den Datensatz eines anderen bearbeite?
    Jo, das ist ein bekanntes, schwieriges Problem, für das es keine Patentlösung gibt.
    Am besten siehst du zu, dass das nicht vorkommen kann.

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

    Tach auch,

    super vielen Dank für die Hilfe und deiner Arbeit die dahinter steckt.
    Um also ernsthaft mit einer Datenbank zu arbeiten muss man andere
    Geschütze auffahren als diese erbärmlichen generierten TableAdapter: Dataset->Db

    Das habe ich mir angeschaut und muss leider sagen, war für mich dann doch noch eine Reizüberflutung :(

    Mein Code da oben hat noch ein weitere Schwachstelle, wenn die Tabelle nach Name sortiert ist landen wir auf einen falschen Datensatz.

    Ich habe das nun so gelöst:

    VB.NET-Quellcode

    1. Private Sub BTNNeu_Click(sender As Object, e As EventArgs) Handles BtnNeu.Click
    2. Me.TblmitarbeiterBindingSource.AddNew()
    3. TXTLastUser.Text = Environ("USERNAME")
    4. TXTNeuanlage.Text = Today
    5. Me.TblmitarbeiterBindingSource.EndEdit()
    6. Me.TblmitarbeiterTableAdapter1.Update(DatenpvDataSet.tblmitarbeiter)
    7. Me.TblmitarbeiterTableAdapter1.Fill(DatenpvDataSet.tblmitarbeiter)
    8. Me.TblmitarbeiterBindingSource.Filter = Nothing
    9. Dim myReader As MySqlDataReader
    10. Dim mySelectQuery As String = "SELECT max(id) AS maxid FROM tblmitarbeiter"
    11. Dim myCommand As New MySqlCommand(mySelectQuery, objConn)
    12. Dim lngID As Long
    13. objConn.Open()
    14. myReader = myCommand.ExecuteReader()
    15. While myReader.Read()
    16. lngID = myReader.GetString(0)
    17. End While
    18. myReader.Close()
    19. objConn.Close()
    20. Dim lngIndex As Long
    21. lngIndex = TblmitarbeiterBindingSource.Find("ID", lngID)
    22. BindingNavigator1.BindingSource.Position = lngIndex
    23. End Sub


    Mit Sicherheit gibt es hier noch Optimierungsbedarf, aber es läuft schon einmal.

    Wenn aber mehrere Leute Daten eingeben, passiert es dann nicht das ich evtl. den Datensatz eines anderen bearbeite?
    Jo, das ist ein bekanntes, schwieriges Problem, für das es keine Patentlösung gibt.
    Am besten siehst du zu, dass das nicht vorkommen kann.


    In Access konnte ich die ID so auslesen

    VB.NET-Quellcode

    1. Sub subIDLesen()
    2. Dim rs As DAO.Recordset
    3. Dim lngID As Long
    4. Set rs = CurrentDb.OpenRecordset("SELECT ID, LetzerUser FROM tblMitarbeiter;")
    5. rs.AddNew
    6. rs!LetzerUser = Environ("USERNAME")
    7. lngID = rs("ID")
    8. rs.Update
    9. rs.Close
    10. Debug.Print lngID
    11. End Sub

    Da gibt es dann das Problem nicht. So was ist mit MySQL bei VB.Net nicht möglich?
    Gefunden habe ich jedenfalls nichts.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    Mein Code da oben hat noch ein weitere Schwachstelle, wenn die Tabelle nach Name sortiert ist landen wir auf einen falschen Datensatz.
    Ja, das ist logische Folge des ungünstigen Ansatzes, die Tabelle komplett neu zu laden.
    Mit der von mir gegebenen "Reizüberflutung" löst sich das in Luft auf - weil da wird die Tabelle nicht neugeladen für ein popeliges Insert.

    Willst du wirklich von nun an und in Ewigkeit Datenbank-Anwendungen entwickeln, die bei jedem Insert die Tabelle komplett neu laden? - kann doch nicht dein Ernst sein.
    In komplexeren Szenarien wird das auch noch kaum handle-bar.
    Tach auch,

    Willst du wirklich von nun an und in Ewigkeit Datenbank-Anwendungen entwickeln, die bei jedem Insert die Tabelle komplett neu laden? - kann doch nicht dein Ernst sein.
    In komplexeren Szenarien wird das auch noch kaum handle-bar.


    Nicht wirklich, aber habe nun den ganzen Tag damit verbracht es um zu setzen auf mein Projekt und komme nicht weiter bis zu dieser Fehlermeldung:
    _Persistance.Save() --> System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Auch weiß ich nicht wie man im Dataset-Designer sofort alle TableAdapter raus wirft?

    Habe aber schon was Neues gelernt dadurch, durch diesen Codeschnipsel.

    Select Case True
    Case sender Is btBestell_1995_11 : Fill_1995_11()
    Case sender Is btFillBestellDetailCustom : FillSelectedBestellDetail()
    Case sender Is btTest : Test()
    Case sender Is btFillAll : _Persistance.FillAll()
    Case sender Is btSave : _Persistance.Save()
    Case sender Is btArtikel_Filtered : FillArticleFiltered()
    End Select

    Das hat andere Probleme bei mir gelöst, von den ich erst dachte es gibt keine andere Möglichkeit.

    Ich will das auch noch später nochmal versuchen wirklich zu verstehen. Ich denke auch, wenn ich eine Weile mich mehr mit VB.NET beschäftige, dann fällt mir das leichter so etwas zu verstehen.
    Bis jetzt habe ich ja nur ein Probeprojekt gestartet um etwas das Ganze zu verstehen. Danach erst möchte ich meine bisherige Access Anwendung Formular für Formular entwickeln.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    _Persistance.Save() --> System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Das ist ein sehr dummer Fehler: Der Variable _Persistance ist scheinbar nie ein Persistance-Objekt zugewiesen worden.
    Mehr kannich nicht sagen - ich kenne ja deinen Code nicht.

    Lupusverlach schrieb:

    TableAdapter raus wirft?
    Naja - im Dataset-Designer werden die Tabellen ja immer als DoppelPack dargestellt: Oben die Table, unten der TableAdapter. Da klickst man auf den Namen des Adapters und drückt [Entf]

    Lupusverlach schrieb:

    Bis jetzt habe ich ja nur ein Probeprojekt gestartet um etwas das Ganze zu verstehen. Danach erst möchte ich meine bisherige Access Anwendung Formular für Formular entwickeln.
    Zum Probieren bau dein Projekt auf Access auf - nicht MySql.
    Ein Access-Projekt kann man zur Not verzippen und hier anhängen - inklusive Datenbank. So kann ich da u.U. mal reingucken und Vorschläge machen.

    Bei MySql bleibst du in dieser Hinsicht auf dich allein gestellt. Einer gezippten MySql-Anwendung fehlt immer die Datenbank - ist also immer nur auf deinem Rechner lauffähig.



    Achso - was am einfachsten ist: Lass die Datenbank ganz weg.
    Zumindest für die Übertragung deiner Access-Anwendung brauchst du überhaupt keine Datenbank - das geht auch nur mit einem Dataset - siehe das DatasetOnly-Projekt der Dataset->Db - Solution.
    Oder liegt deine Access-Anwendung in einem Netzwerk, und mehrere Leute arbeiten gleichzeitig damit?

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

    ErfinderDesRades schrieb:

    Ein Access-Projekt kann man zur Not verzippen und hier anhängen - inklusive Datenbank. So kann ich da u.U. mal reingucken und Vorschläge machen.

    da bekomme ich etwas Probleme mit dem Datenschutz :D

    Ich habe es nun noch ein paar mal versucht, ohne es wirklich zu verstehen. Ab und zu kommt man an den Punkt da muss man stoppen und erst mal was anderes machen. Sonst verzettelt man sich.
    Aber ich werde da mit Sicherheit wieder mal ran gehen.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    da bekomme ich etwas Probleme mit dem Datenschutz


    Nicht direkt: Du kannst ja eine Kopie erstellen und ein paar Dummie-Werte eintragen. So hättest du die Möglichkeit, anderen dein Gerüst zu zeigen, damit diese sehen, was los ist. Vielleicht ist das ja eine Überlegung wert.
    Du kannst ja eine Kopie erstellen und ein paar Dummie-Werte eintragen


    Ist mir schon bewusst das dies so machbar ist. Jedoch sind das ca 100 Tabellen und wenn es was bringen sollte, müssten schon einige Zeilen jeweils gefüllt sein das man auch damit arbeiten kann. Wenn ich das Gefühl habe so nicht weiter zu kommen, dann werde ich es nochmal in Betracht ziehen.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    da bekomme ich etwas Probleme mit dem Datenschutz
    in post#11 sprichst du von einem Probe-Projekt.
    Und ein solches kannst du natürlich verzippen, wenn du Hilfe brauchst.

    Das ist übrigens eine sehr gute Idee, sich erstmal in einem Probe-Projekt die notwendigen Fertigkeiten anzueignen, bevor du dich an deine 100(!) Tabellen machst, und da womöglich einen Riesen-Schlamassel anrichtest.

    Wie gesagt: Das Herumfuchteln mit Commands und Reader, und Tabelle neuladen für jedes Insert... - das hat keine Zukunft. Wenn du das auf deine 100 Tabellen anwenden willst... - das muss am Ende alles in die Tonne getreten werden, und da tut man sich dann schwer mit, wenn man da Mann-Monate investiert hat.
    Tach auch,

    ErfinderDesRades schrieb:

    in post#11 sprichst du von einem Probe-Projekt.
    Und ein solches kannst du natürlich verzippen, wenn du Hilfe brauchst.


    Darfs auch WinRAR sein :D

    Hatte es nun mit einer klitzen kleinen Accessdatenbank versucht, doch die läuft nicht. Daten werden zwar gelesen, aber kann sie nicht zurück schreiben. Stelle ich genau diese um auf MySQL läuft alles.
    Änder ich einen Datensatz, klicke auf Speichern, passiert nichts. Blättere ich einen Datensatz weiter und mache das gleiche, folgt diese Fehlermeldung.
    Fehlermeldung:
    System.Data.DBConcurrencyException: "Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt."
    Diese Ausnahme wurde ursprünglich von dieser Aufrufliste ausgelöst:
    [Externer Code]
    Projektmappe.FrmHaupt.BTnSpeichern_Click(Object, System.EventArgs) in FrmHaupt.vb
    [Externer Code]

    Das ist übrigens eine sehr gute Idee, sich erstmal in einem Probe-Projekt die notwendigen Fertigkeiten anzueignen, bevor du dich an deine 100(!) Tabellen machst, und da womöglich einen Riesen-Schlamassel anrichtest


    Sind inzwischen gar nicht mehr so viele Tabellen. Beim rumwurschteln um es nun unter VB.NET zum laufen zu bringen sind mir einige Tabellen in der Access Anwendung aufgefallen, die schon seit Jahren gar nicht mehr verwendet werden, bzw. so eine oder andere Combobox auch gut ohne Tabelle auskommen.

    Wie gesagt: Das Herumfuchteln mit Commands und Reader, und Tabelle neuladen für jedes Insert... - das hat keine Zukunft. Wenn du das auf deine 100 Tabellen anwenden willst... - das muss am Ende alles in die Tonne getreten werden, und da tut man sich dann schwer mit, wenn man da Mann-Monate investiert hat.


    Habs ja vor richtig zu machen, habe es mir aber auch einfacher vorgestellt :(
    Programmierungen ohne Datenbank haben hier super geklappt, sobald es darum geht Datenbanken zu verarbeiten werde ich nervös :S
    Dateien
    • Projektmappe.rar

      (1,12 MB, 152 mal heruntergeladen, zuletzt: )
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

    Lupusverlach schrieb:

    Darfs auch WinRAR sein
    Nein - Winrar habich nicht installiert.
    Wozu Winrar installieren, wenn zippen Windows-OnBord ist?

    Aber ich hab jetzt auch vergessen, warum du das Projekt uploadest.
    Erinnere ich das richtig, dass ich da nu einen DB-Zugriff mit der DbPersistance dranbasteln soll?

    ErfinderDesRades schrieb:

    Erinnere ich das richtig, dass ich da nu einen DB-Zugriff mit der DbPersistance dranbasteln soll?

    Nee nee, so unverschämt bin ich nun doch nicht. Geht erst einmal um die Fehlermeldung.
    Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt
    Ich will das danach schon noch einmal selbst versuchen, jedoch, so mein Gedanke, am besten erst einmal mit etwas was fehlerfrei läuft. Nicht das sich der Fehler später wieder findet und ich es nicht auf die DbPersistance schiebe.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL