Beim öffnen einer Form ein neues Item erstellen

  • VB.NET

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

    Beim öffnen einer Form ein neues Item erstellen

    Hallo!

    Ich habe ein Formular für eine XML Datenbank erstellt, in welchem sich die Benutzer eintragen können. Nun möchte ich dem Benutzer es ersparen immer auf den Add Item Button im BindingSourceNavigator zu klicken. Meine (eher magere) Lösung sieht so aus:

    Die Form wird in der MainForm geöffnet via MenuStrip und beim Laden der Form verwende ich folgenden Code:

    VB.NET-Quellcode

    1. Private Sub CustomerNew_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Me.BindingNavigatorAddNewItem.PerformClick()
    3. End Sub



    Klappt eigentlich jedes mal, nur wenn der Benutzer jetzt das Fenster schließt und wieder öffnet wird wieder ein NEUES Item eröffnet ohne, dass die anderen geschlossen / gespeichert wurden. Also wenn man die Form öfters mal zwischendurch zumacht hat man am Ende n Haufen leerer Items.


    Jemand ne bessere Idee?


    Danke
    Guck dir mal vier Views-Videos an.
    In glaub jedem Video turne ich vor, dass man den BindingNavigator am besten sofort wieder runterschmeisst vom Form.
    Nimm ein einfaches Datagridview. Das hat unten eine leere Zeile - da reinschreiben, Enter, und zugefügt ist der neue Datensatz.

    (Übrigens: Xml-Datenbanken gibt es nicht)
    Hi dr. Nick

    mit XML Datenbank meinst du ein typisiertes DataSet richtig?

    Erstmal kann ich dir empfehlen OOP zu programmieren.

    Kleiner Exkurs:
    Spoiler anzeigen
    "Gehen wir davon aus, deine Einträge sind Notizen"
    Nun erstellst du eine neue Klasse cNotizen (oder wie du möchstest).
    Solltest du schon deine DataTable notizen angelegt haben, kannst du alle Columns deiner DataTable in deiner neuen Klasse verwenden.

    Zu deinen Klassenvariablen legst du nun Property's an.

    Als nächstes brauchst du in deiner Klasse cNotizen eine Function welche dir den Rückgabewert einer DataTableRow zurückgibt.
    ______________________________________________________________

    Nachdem du deine Klasse fertig modelliert hast, brauchst du nur in deinem Formular (ich schätze es ist einfach eine neue Form) beim Button.Click ein neues Objekt deiner Klasse erzeugen mit den entsprechenden Variablen des Formulars. Durch die Function mit dem DataRow Rückgabewert brauchst du nur deine DataSet.DataTable.add(...) Methoden aufrufen und kannst so direkt dein neu erstelltes Objekt in dein DataSet speichern.


    Entsprechende Links, die dir Helfen findest du hier:

    [HOW TO] Eigene Klassen erstellen, verwalten und verwenden


    Mag jetzt vielleicht absurd klingen :D aber wenn Programmieren, dann richtig, auch wenn viele Dinge mit nur 2 Zeilen erledigt sein können.
    Du musst meinen Ratschlag hier nicht beachten, allerdings kann ich dir das OOP programmieren wirklich nur ans Herz legen, einmal geschnallt, kannst du ganz easy größere Projekte stemmen.
    na, dann willst du wohl einen AddNew-Dialog haben. Dialoge sind besondere Forms, und eine ihrer Eigenheiten ist, dass man die Eingabe immer auch Canceln können muss.
    Guck dir erstmal, wie Dialog vom Prinzip her geht: Dialoge: Instanziierung von Forms und Aufruf von Dialogen

    Und dann bezogen auf gebundenes Dataset: Daten laden, speichern, verarbeiten - einfachste Variante
    Was ich da allerdings in letzterem Film vorturne baut auf meine Helpers-Projekte auf, welche mir Form-Übergreifendes Databinding bereitstellen.
    Wenn du die Helpers nicht einbindest, wird das so schnucklig wie im Film nicht ablaufen, sondern du musst formübergreifendes Databinding selbst nochmal erfinden.

    Und auch wenn du kein DGV verwenden darfst - den BindingNavigator schmeiß trotzdem runter, oder wofür brauchst du den (meinst ihn zu brauchen)?
    Bez. des BindingNavigator ich WILL ihn gar nicht haben ich teile auch deine Meinung, dass es das unnötigste ist was je erfunden wurde.

    Prinzipiell gesagt: Ich will beim öffnen der Form ein neues Item erstellen, der User soll nicht erst per Mausklick eines erstellen müssen, er soll auf Speichern drücken um seinen Datensatz zu sichern und auf Löschen.... aber ich will nicht dass er erst ein Item erstellen muss.

    Da beim Öffnen der Form, durch meinen Code, immer ein neues Item erzeugt wird, währe meine Idee zu fragen ob nicht schon eins vorhanden ist und falls ja soll keines mehr erzeugt werden. Eine Einfache if abfrage sollte das Problemlos lösen, nur leider weis ich nicht wie ich herausfinde ob schon ein neues Item erzeugt ist, verstehst du? Ich weiß nicht wie der Code auszusehen hat. das ist mein Hauptproblem.

    dr. Nick schrieb:

    Prinzipiell gesagt: Ich will beim öffnen der Form ein neues Item erstellen, der User soll nicht erst per Mausklick eines erstellen müssen, er soll auf Speichern drücken um seinen Datensatz zu sichern und auf Löschen.... aber ich will nicht dass er erst ein Item erstellen muss.


    hmmm?! Das wird tricky xD

    Dann zeig doch mal was du bisher hast...

    dr. Nick schrieb:

    Ich will beim öffnen der Form ein neues Item erstellen, der User soll nicht erst per Mausklick eines erstellen müssen

    dr.Nick schrieb:

    meine Idee zu fragen ob nicht schon eins vorhanden ist und falls ja soll keines mehr erzeugt werden.

    Was meinst du jetzt mit Item? Wenn du einen neuen Datensatz meinst - darf der User, dann nur einen Datensatz erstellen?
    Hallo!

    Mein bisheriges Werk befindet sich im Anhang, wäre sehr dankbar wenn ihr mal drüberschaun könntet. Es gibt dazu noch folgendes zu sagen:

    1. Das DGV in Form1 SOLL auf ReadOnly gestellt sein und dient nur als Anzeige
    2. Der AutoWert ID startet immer mit -1 ??
    3. Wenn ich in der Neu Form jetzt ein Item hinzufüge, was jetzt auf einmal funktioniert (JUHUU), soll nach dem speichern das DGV aktualisiert werden ich habe es mit:

    VB.NET-Quellcode

    1. Form1.PhoneTableDataGridView.Refresh()
    versucht jedoch leider ohne erfolg.


    Bin für jede hilfe dankbar.


    Mfg
    Dateien
    • telefonbuch.zip

      (207,91 kB, 109 mal heruntergeladen, zuletzt: )
    Danke für deine Verbesserung erstmal.

    Eine Frage hätte ich aber noch bezüglich des Save Buttons im MenuStrip... der Code hierfür ist ja:

    VB.NET-Quellcode

    1. ​TableAdapterManager.UpdateAll(PhoneDBDataSet)


    Wenn ich jetzt nach dem Editieren in der Neu Form die UpdateAll funktion in der Form1 aufrufen will habe ich versucht:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Me.Validate()
    3. Me.PhoneTableBindingSource.EndEdit()
    4. Form1.TableAdapterManager.UpdateAll(PhoneDBDataSet) '<---
    5. Me.Close()
    6. End Sub

    Das funktioniert jedoch nicht, wenn ich aber:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Me.Validate()
    3. Me.PhoneTableBindingSource.EndEdit()
    4. Form1.SaveToolStripMenuItem.PerformClick() '<---
    5. Me.Close()
    6. End Sub


    Dann wird die Datenbank problemlos geupdated obwohl es ja eigentlich 2 mal die selbe funktion ist, funktioniert nur eine variante, warum?


    mfg
    Form1 ist ein Datentyp, und kein Objekt.
    Lass solche Zugriffe einfach bleiben:

    VB.NET-Quellcode

    1. Form1.TableAdapterManager.UpdateAll(PhoneDBDataSet)
    Versuch, den Unterschied von Datentyp und Objekt zu kapieren:
    erfinderdesrades.unitweb.de/Programmer/Blogs/VeryBasics.html

    Und vor allem: Visual Studio - Empfohlene Einstellungen
    Soblald es angelegt wurde, etwa in dieser Art:

    VB.NET-Quellcode

    1. Public Class Form1
    (Form1.Designer.vb)
    genauer: es ist ein Referenz-Datentyp, kein ValueTyp, und erbt von

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    (Form1.Designer.vb)
    Ein Objekt hat einen Datentyp, es ist aber kein Datentyp. Das ist der Unterschied.

    Ja, es gibt auch den Datentyp Object, und es gibt Objekte mit Datentyp Object.

    Form1 aber, wie oben gezeigt, ist ein Datentyp, ist kein Objekt.

    VB.NET-Quellcode

    1. dim frm1 = new Form1
    So. frm1 ist nun ein Objekt vom Datentyp Form1. frm1 - Objekt, Form1 - Datentyp.
    Objekte erstellt man mit dem Schlüsselwort New.

    Und von dieser Verwechslung rührte auch das Fehlverhalten her, was auftrat.