Dataset-DataGridView-Textbox

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von sterat.

    Dataset-DataGridView-Textbox

    Hallo zusammen,

    ich habe mit Dataset eine (Mini-)Datenbank erstellt. Ich möchte gerne mit Textboxen das Dataset befüllen. Die neue Eingabe soll aber die bereits vorhandenen Datensätze nicht überschreiben. Ich habe überhaupt keine Ahnung wie ich das umsetzen soll. Habt Ihr eventuell ein Beispiel für mich?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ButtonSave_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Me.Validate()
    3. DataSet1.WriteXml(Datensatz.FullName)
    4. End Sub
    5. Private Sub ButtonClose_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    6. Me.Close()
    7. End Sub
    8. Private Sub Button_ReLoad_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    9. DataSet1.Clear()
    10. For Each Daten As DataTable In DataSet1.Tables
    11. Daten.BeginLoadData()
    12. Next
    13. DataSet1.ReadXml(Datensatz.FullName)
    14. For Each Daten As DataTable In DataSet1.Tables
    15. Daten.EndLoadData()
    16. Next
    17. DataSet1.EnforceConstraints = True
    18. DataSet1.AcceptChanges()
    19. End Sub
    20. Private Sub TextBox_Nachname(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    21. End Sub
    22. Private Sub TextBox_Vorname(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.TextChanged
    23. End Sub
    24. End Class


    Im Anhang das Projekt.
    Bilder
    • 1.png

      6,51 kB, 377×350, 194 mal angesehen
    • 2.png

      5,72 kB, 377×350, 211 mal angesehen
    Dateien
    Du musst die Textboxen im Designer an dieselbe BindingSource binden, an der auch das Listen-Control (hier: ein DGV) gebunden ist.
    Das geht am einfachsten, indem du die Tabelle als DetailView aus dem Datenfenster ziehst.

    Dann können deine Textboxen den angewählten Datensatz editieren.
    Einen neuen Datensatz legst du mit BindingSource.AddNew an, und der wird natürlich ebenso editiert.

    gugge etwa "DetailView" auf Movie-Tuts

    PS: ist natürlich extrem ungünstig, dass ListenControl und Textboxen auf verschiedenen TabPages liegen :wacko:
    OK - Hab mal bisschen rumprobiert.

    VB.NET-Quellcode

    1. Private Sub ButtonÜbertragen(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    2. DataTable1BindingSource.AddNew()
    3. TextBox1.Text = ("")
    4. TextBox2.Text = ("")
    5. DataTable1BindingSource.EndEdit()
    6. End Sub


    Damit wird der erste Eintrag geändert und anschließend springt der Courser in die letzte Zeile. :(
    Hihi - jetzt kommt der eigentliche Lerneffekt:
    nutze die Suche des ObjectBrowsers, um dich über BindingSource.Addnew zu informieren.
    Von da aus kannste auch mit F1 in die Msdn hopfen.

    Edit: ah, du hast ja doch wenigstens ein bischen zuwege gebracht.
    nur ich sprach doch ausschließlich von AddNew, nicht von EndEdit oder Textboxen löschen.

    Verwende nur Code, den du verstehst.
    Jetzt musste mir erklären, was du mit BindingSource.EndEdit bezweckst.

    Grad erst Bildle gesehen: Warum sind da leere Datensätze im DGV angezeigt? Ah - vmtl. wegen der Fehlfunktion.

    Der Button darf nicht mit "Übertragen" beschriftet sein, sondern mit "Add New" oder zu Deutsch: "neuen Datensatz hinzufügen".

    Die Buttons sollten übrigens dringend vernünftig benamt sein. Für Button1, Button2, Button3 gehört man erschossen.

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

    sterat schrieb:

    BindingSource.EndEdit: Ich dachte, damit wird der Eintrag abgeschlossen.

    jo, aber du willst doch eine Eingabe nicht abschließen, sondern erstmal anfangen.

    Explizit abschließen muß man fast nie - das geht automatisch, etwa wenn das Control den Focus abgibt.
    Maximal beim Speichern muß man .EndEdit aufrufen, um den zuletzt bearbeiteten Eintrag abzuschließen, falls das Control noch den Focus hat.

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

    VB.NET-Quellcode

    1. 'Inhalt Textboxt 1 und 2 per Button in Dataset hinzufügen
    2. Private Sub Button_AddNew(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    3. DataTable1BindingSource.AddNew()
    4. End Sub


    Ich bekomm das nicht gebacken. :cursing: Der erste Eintrag (Pos. 1) in der Liste wird immer (nach Programm Neustart) überschrieben. Die folgenden Einträge werden dann wie gewünscht ans Ende der Liste hinzugefügt. Warum wird der erste Eintrag aber überschireben?
    Hi,

    ErfinderDesRades schrieb:

    ich find die Grid-Aktualisierung bisserl unzuverlässig - da habich bischen nachgeholfen
    Keine Ahnung was Du damit meinst. Ich sehe keine Änderung, bis auf jene:

    VB.NET-Quellcode

    1. Private Sub Panel1_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Panel1.Validated
    2. DataGridView1.InvalidateRow(DataTable1BindingSource.Position)
    3. End Sub


    Damit ändert sich aber nicht das Problem. Siehe Screen. btAddNew.Click überschreibt den ersten Eintrag und springt dann in die letzte Zeile. Erst ab dem zweiten Eintrag werden diese unten angehängt.
    Bilder
    • 3.png

      10,84 kB, 639×317, 203 mal angesehen
    was meinst du mit ersten Eintrag?
    Die erste Zeile des DGVs ist doch unverändert.
    Meinst du die "5"?

    Ja, das ist doch die ID-Spalte. Die ist im typDataset als AutoWert eingestellt, sodass niemals ein neuer Datensatz erzeugt wird, dessen ID nicht von vornherein gültig ist.

    Guggemol die relationale GrundIdee, um zu verstehen, wozu das gut ist.
    Hi,

    ErfinderDesRades schrieb:

    was meinst du mit ersten Eintrag?

    Die erste Zeile des DGVs ist doch unverändert.

    Meinst du die "5"?
    Nein, die erste Zeile wurde mit "Geht nich" (wie im Screenshot zu sehen) überschrieben. Hier mal meine Vorgahensweise um zu verdeutlichen was passiert.

    1. Ich öffne das Prog.
    2. Ich lade die Datei - es erschein der Inhalt im DGV
    3. Ich klicke in Texbox1 und trage Inhalt ein - ebenso in Textbox2
    4. Ich bestätige mit btAddNew

    In diesem Moment wird die erste Zeile überschrieben und der Courser befindet sich dann in der letzten Zeile. Wie im letzten Screnn zeile 5. :(
    jo, du fasst die Logik falsch auf.

    Der Button heißt AddNew, weil er ein neues Item added.

    Willst du ein Item zufügen, so mußt du es erst neu adden, danach die Eingaben machen.

    Aber du denkst, man könne erst die Eingaben machen, und das Zeug anschließend adden.

    So ists aber nicht angelegt, sondern mit den Textboxen kann man jedes Item editieren - sowohl die bereits bestehenden, als auch ein neu geaddetes.
    OffTopic:

    sterat schrieb:

    meine Logik
    vorsicht mit dem Spruch - das kann bei mir philosophische Diskussionen auslösen ;).

    Weil Logik ist allgemeingültig - "deine Logik" gibt es nicht.
    Es gibt die Logik, und was davon abweicht ist unlogisch.

    Das sozialpädagogische Sichtweisen-Gewinsel hat im physikalisch/mathematisch/technischen Bereich keine Gültigkeit, sondern nur da, wo Psychologie mit reinspielt.
    /OffTopic

    ErfinderDesRades schrieb:


    Weil Logik ist allgemeingültig - "deine Logik" gibt es nicht.

    Es gibt die Logik, und was davon abweicht ist unlogisch.
    Tja, auch damit hast Du recht. Ersetze Logik mit Verständnis. :D

    OK - Ausgangssituation war eigentlich, dass ich mit Textboxen die Datenbank befüllen wollte. AddNew scheint dann nicht das Richtige zu sein. Oder gibt es eine Möglichkeit mit Programmstart bzw. mit Laden der Datenbank den Courser direkt in die letzte freie Zeile zu setzen, damit ich direkt einen neuen Eintrag platziere?

    Oder
    ist es besser, direkt die XML zu beschreiben?
    Oh Menno - die Lösung war so einfach - MyBase.Load ist die Lösung!

    VB.NET-Quellcode

    1. Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. DataSet1.ReadXml(Datensatz.FullName)
    3. DataTable1BindingSource.AddNew()
    4. End Sub


    Somit wird bei Programmstart die XML-Datei automatisch geladen und der erste Eintrag bestätigt(ohne Änderung), die letzte Zeile im DGV markiert und die Textboxen haben keinen Inhalt. :P

    @ErfinderDesRades: Sorry, dass ich Deine Geduld so strapaziert habe.