Endlosformular

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Lupusverlach schrieb:

    Sorry, aber Vorname und Nachname ergibt irgendwie wenig Sinn. Das ist nicht eindeutig.
    War ja auch nur ein Beispiel. Aber irgendwie muss ja eine Feststellung des zuständigen Mitarbeiters stattfinden. Das Problem ist nur: ne ID ist zwar eindeutig, aber (sonst) absolut nichtssagend. Woher willst Du wissen, welche von den 5 Sabine Müllers am Standort Bielefeld die ID 42 hat, die jetzt in LblID_im_Form drinsteht?

    ##########

    Zur Fehlermeldung: Habe Dein Projekt gestartet. Aber wie kommt man zum Fehler?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    VaporiZed schrieb:

    Woher willst Du wissen, welche von den 5 Sabine Müllers am Standort Bielefeld die ID 42 hat, die jetzt in LblID_im_Form drinsteht

    Jetzt verstehe ich dich, lag an mir, das hätte ich besser beschreiben sollen dann hättest Du mich verstanden.
    Einen neuen Datensatz in tblPost wird nur angelegt, wenn der Anwender gerade den entsprechenden Mitarbeiter offen hat.
    Daher ist die ID immer abrufbar. Mit Me.BSPost.AddNew() wurde ja auch ein Datensatz entsprechend ordentlich angelegt. Jedoch gab es dann hier diese Fehlermeldung mit DBNull. Das haben wir ja nun gelöst.

    VaporiZed schrieb:

    Zur Fehlermeldung: Habe Dein Projekt gestartet. Aber wie kommt man zum Fehler?


    Dort oben rechts auf Neu klicken.

    Neuer Datensatz ist dann damit angelegt:

    VB.NET-Quellcode

    1. Private Sub BtnNeuPost_Click(sender As Object, e As EventArgs) Handles BtnNeuPost.Click
    2. Dim lngID As Long = CLng(LblID_im_Form.Text)
    3. Dim DerZuständigeMitarbeiter = EndlosformDataSet.tblMitarbeiter.Single(Function(x) x.ID = lngID)
    4. EndlosformDataSet.tblPost.AddtblPostRow(DerZuständigeMitarbeiter, Date.Today, "Bemerkung", Date.Now)
    5. 'Me.BSPost.AddNew()
    6. Me.BSPost.EndEdit()
    7. Me.TblPostTableAdapter.Update(EndlosformDataSet.tblPost)
    8. Me.TblPostTableAdapter.Fill(Me.EndlosformDataSet.tblPost)
    9. ' ############ Wenn das aktiv ist kommt es hier zur Fehlermeldung ########################
    10. 'AktiviereDataDisplay()
    11. BSPost.Sort = ("Eingang desc, ID desc")
    12. BSPost.MoveFirst()
    13. End Sub


    Jedoch, sobald das Endlosformular rechts neu gezeichnet werden soll, wird aktiviert mit AktiviereDataDisplay()

    VB.NET-Quellcode

    1. Private Sub AktiviereDataDisplay()
    2. FlowLayoutPanel1.Controls.Clear()
    3. For i = 0 To BSPost.Count - 1
    4. BSPost.Position = i
    5. Dim dd As New DataDisplay()
    6. dd.Row = DirectCast(DirectCast(BSPost.Current, DataRowView).Row, endlosformDataSet.tblPostRow)
    7. FlowLayoutPanel1.Controls.Add(dd)
    8. Next
    9. End Sub

    Kommt es zu besagten Fehlermeldung.

    P.S. Aus Bielefeld nehmen wir keine Mitarbeiter bei uns auf, kann nur Fake sein, da es das nicht gibt. ;)
    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
    Ganz kurz zum Hinzufügen der Row: Das geht so:

    VB.NET-Quellcode

    1. EndlosformDataSet.tblPost.AddtblPostRow(DirectCast(DirectCast(BSMitarbeiter.Current, DataRowView).Row, endlosformDataSet.tblMitarbeiterRow), Date.Today, "Bemerkung", Date.Now)

    Im BSMitarbeiter.Current steckt ja der ausgewählte Mitarbeiter schon drin und kann daher auch für die Neuerstellung der Post-Zeile hergenommen werden.

    Lupusverlach schrieb:

    Aus Bielefeld nehmen wir keine Mitarbeiter bei uns auf, kann nur Fake sein
    Ah, da wurde die Personalabteilung gut geschult :P
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Mal Frage:

    ErfinderDesRades schrieb:

    was in access als Endlosfomular bekannt ist, dem entspricht in .Net am ehesten das ReportViewer-Control: ReportViewer-Tutorial für Anfänger
    Aber ich hab das in schlechter Erinnerung (aber vergessen warum)
    Bist du inzwischen mal dazu gekommen, das Tut anzugucken, und (ich weiss - anstrengend) auch die dortige Beispielsolution downzuloaden und (uff - dann reichts aber!) gar mal zu starten?

    ErfinderDesRades schrieb:

    Bist du inzwischen mal dazu gekommen, das Tut anzugucken

    Ja, und mir ist jetzt noch schwindelig :/

    ErfinderDesRades schrieb:

    auch die dortige Beispielsolution downzuloaden und (uff - dann reichts aber!) gar mal zu starten?

    Bisher nur Fehlermeldungen beim kompilieren, werden zwar von mal zu mal weniger, aber will mich erst einmal auf die Lösung konzentrieren die hier bisher geboten wurde. Wenn das läuft schau ich mir das auch noch mal genauer an. Ergibt wenig Sinn es parallel zu machen.
    Dennoch Danke für den Hinweis.
    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
    naja - ich halte den FlowlayoutPanel-Ansatz ja für einen Holzweg.
    bzw. da wird das Rad neu erfunden - weil: ein ReportViewer-Control gibts ja schon.

    Bisher nur Fehlermeldungen beim kompilieren
    Dassis schlecht.
    Habich jetzt nachgeguckt, jo, die nötigen ReportViewer-Assemblies finde ich auch nicht mehr.
    Womöglich hat MS dieses Control aufgegeben - die wollen ja ihren dollen SSRS verkaufen.

    Ok - der Tip warnix, weil ein Tut mit nichtkompilierendem BeispielCode ist nix.

    Also weiterhin viel Erfolg beim Neu-Erfinden!

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

    VaporiZed schrieb:

    EndlosformDataSet.tblPost.AddtblPostRow(DirectCast(DirectCast(BSMitarbeiter.Current, DataRowView).Row, endlosformDataSet.tblMitarbeiterRow), Date.Today, "Bemerkung", Date.Now)

    Beim einpflegen von dem Satz bin ich auf die Lösung gekommen. Bevor neue Datensätze angefügt werden, muss das Panel geleert werden. Wenn alle Datensätze gespeichert sind, wieder füllen.

    So sieht meine Lösung aus

    VB.NET-Quellcode

    1. Private Sub BtnNeuPost_Click(sender As Object, e As EventArgs) Handles BtnNeuPost.Click
    2. FlowLayoutPanel1.Controls.Clear() ' Das Panel muss erst geleert werden, bevor neue Datensätze angefügt werden.
    3. EndlosformDataSet.tblPost.AddtblPostRow(DirectCast(DirectCast(BSMitarbeiter.Current, DataRowView).Row, endlosformDataSet.tblMitarbeiterRow), Date.Today, "Bemerkung", Date.Now)
    4. Me.BSPost.EndEdit()
    5. Me.TblPostTableAdapter.Update(EndlosformDataSet.tblPost)
    6. Me.TblPostTableAdapter.Fill(Me.EndlosformDataSet.tblPost)
    7. AktiviereDataDisplay()
    8. BSPost.Sort = ("Eingang desc, ID desc")
    9. BSPost.MoveFirst()
    10. End Sub



    ErfinderDesRades schrieb:

    Ok - der Tip warnix, weil ein Tut mit nichtkompilierendem BeispielCode ist nix.
    Also weiterhin viel Erfolg beim Neu-Erfinden!

    Ein Tut das nix tut, das tut nicht ^^

    Denke jedoch inzwischen die Lösung gefunden zu haben, selber darauf gekommen wobei ... so ganz verstehe ich aber nicht warum das so ist :D
    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

    ErfinderDesRades schrieb:

    Habich jetzt nachgeguckt, jo, die nötigen ReportViewer-Assemblies finde ich auch nicht mehr.
    Womöglich hat MS dieses Control aufgegeben - die wollen ja ihren dollen SSRS verkaufen.

    Die nötigen Assemblies für VS2017 und höher gibt es wie folgt zu installieren:
    docs.microsoft.com/en-us/sql/r…new-windows-forms-project
    Man muss nur aufpassen, das das Zielframework entsprechend dazupasst mindestens NET Framework 4.6...

    VaporiZed schrieb:

    EndlosformDataSet.tblPost.AddtblPostRow(DirectCast(DirectCast(BSMitarbeiter.Current, DataRowView).Row, endlosformDataSet.tblMitarbeiterRow), Date.Today, "Bemerkung", Date.Now)


    Nochmal danke für die Hilfe.
    Ich frage mich seit Tagen und finde jedoch keine Lösung, wenn man mit einer Zeile einen Datensatz hinzufügen kann, kann man so auch einen Datensatz mit einer Zeile löschen?
    Die passende ID für den Datensatz wäre ja bekannt.
    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
    Für das Löschen kannst Du mehreres machen: Wenn Du eine BidingSource hast, kannst Du mit DeineBindingSource.RemoveCurrent arbeiten. Damit geht es am schnellsten, da Du Dich gar nicht mehr drum kümmern musst, eine bestimmte Row erstmal zu ermitteln.
    Oder Du arbeitest notfalls über die DataTable mit DeinTds.DeineDataTable.RemoveDeineDataRow(DeineDataRow)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Lupusverlach schrieb:

    kann man so auch einen Datensatz mit einer Zeile löschen?
    Na guck doch deine DataRows mal im Objectbrowser gründlich an.
    Vielleicht findest du ja eine Methode die "löschen" heisst (auf englisch natürlich).

    DeinTds.DeineDataTable.RemoveDeineDataRow(DeineDataRow) ist nicht geeignet, da ein DataAdapter das nicht als Delete auffasst.

    ErfinderDesRades schrieb:

    Na guck doch deine DataRows mal im Objectbrowser gründlich an.
    Vielleicht findest du ja eine Methode die "löschen" heisst (auf englisch natürlich).

    Das mag ich an deinen Antworten. Sie bringen nicht immer gleich eine Lösung, aber bringen einem auf dem Weg dort hin. Der Lernerfolg ist dadurch um einiges größer.

    Jedoch in diesem Fall hat der Lernerfolg leider nicht eingesetzt. :/

    Gibts noch ein Tipp für den richtigen wenn ich dabei net lächle und bitte sage?

    Es geht dabei um das UserControl aus diesem Beitrag, welches als Endlosformular eingebunden ist. In diesem Formular möchte ich was löschen.
    Der Wert aus der ID Spalte ist hierbei bekannt.

    Bisher ist es so gelöst, jedoch denke ich es geht auch ein oder zweizeilig, oder?

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class DataDisplay
    3. Private _row As endlosformDataSet.PostRow
    4. Public Property Row As endlosformDataSet.PostRow
    5. Get
    6. Return _row
    7. End Get
    8. Set(value As endlosformDataSet.PostRow)
    9. _row = value
    10. LbID.DataBindings.Add("Text", _row, "ID")
    11. lblIDMitarbeiter.DataBindings.Add("Text", _row, "IDMA")
    12. tbxDatum.DataBindings.Add("Text", _row, "Eingang")
    13. tbxBemerkung.DataBindings.Add("Text", _row, "Bemerkung")
    14. LblNeuanlage.DataBindings.Add("Text", _row, "Neuanlage")
    15. End Set
    16. End Property
    17. Private Sub BtnDelete_Click(sender As Object, e As EventArgs) Handles BtnDelete.Click
    18. Dim lngID As Double = CDbl(LbID.Text)
    19. Dim myReader As OleDb.OleDbDataReader
    20. Dim mySelectQuery As String = "DELETE FROM Post WHERE (Post.ID = " & lngID & ")"
    21. Dim objconn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\endlosform.mdb;Persist Security Info=True")
    22. Dim myCommand As New OleDb.OleDbCommand(mySelectQuery, objconn)
    23. objconn.Open()
    24. myReader = myCommand.ExecuteReader()
    25. myReader.Close()
    26. objconn.Close()
    27. End Sub
    28. End Class
    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
    Woah, langsam. Hau Dir ne BindingSource auf's UserControl, setz die Datenquelle auf den Typ endlosformDataSet.PostRow und binde Deine UC-Controls an die BindingSource. Solches DataBinding wie in Zeile#10 bis #14 sollte normalerweise nicht im Code geschehen, aber wenn notwendig (hier nicht), dann im Konstruktor, bitte nicht in einem PropertySetter.
    Sind Deine IDs vom Type Double ?(
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Woah, langsam. Hau Dir ne BindingSource auf's UserControl, setz die Datenquelle auf den Typ endlosformDataSet.PostRow und binde Deine UC-Controls an die BindingSource.


    Es sollte dann schon so aussehen wie hier, eben ein Endlosformular:


    In Post #10 von Takafusa wurde mir eben diese Lösung angeboten, damit es ein Endlosformular werden kann.

    VaporiZed schrieb:

    Solches DataBinding wie in Zeile#10 bis #14 sollte normalerweise nicht im Code geschehen, aber wenn notwendig (hier nicht), dann im Konstruktor, bitte nicht in einem PropertySetter.


    Muss ich erst einmal schauen was denn da der Unterschied ist. Beides nicht wirklich geläufig

    VaporiZed schrieb:

    Sind Deine IDs vom Type Double

    Äh, nee. In Access ist es Long Integer Jedoch erwische ich mich hier immer wieder den falschen Typ einzutragen. Es gab in Access dabei nie eine Fehlermeldung, daher hat sich das irgendwie eingeschlichen und in die DNA übergegangen ;(
    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
    Ok, hab jetzt mal Dein bisheriges Projekt angeschaut. Der Übergang zu dem von mir geschriebenen DataBinding ist ganz einfach, denn Du hast schon alle Zutaten. Im UserControl wählst Du z.B. Label2 an (an der Benennung der Controls solltest Du noch arbeiten ;) ), dann ("Ergebnispfad" siehe Bild im Anhang) klickst Du im Eigenschaftenfenster bei (+) DataBindings auf das +, dann auf den DropDown-Pfeil bei Text und dann bei > TblPostBindingSource auf das >. Dort wählst Du dann IDMA. Und schon ist die TextProperty dieses Labels an die IDMA-Spalte der DataTable und somit an den IDMA-Wert des gewählten BindingSource-Currents (= der gewählten DataTable-Zeile) gebunden. Die anderen Controls bindest Du auch an die Daten. Dann reicht als PropertySetter (bevor Du zum Konstruktor wechselst):

    VB.NET-Quellcode

    1. Set(value As endlosformDataSet.tblPostRow)
    2. TblPostBindingSource.DataSource = value
    3. End Set

    Bilder
    • SimpleBinding.png

      4,25 kB, 302×207, 47 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Lupusverlach schrieb:

    Ich frage mich seit Tagen und finde jedoch keine Lösung, wenn man mit einer Zeile einen Datensatz hinzufügen kann, kann man so auch einen Datensatz mit einer Zeile löschen?

    ErfinderDesRades schrieb:

    Na guck doch deine DataRows mal im Objectbrowser gründlich an.

    Lupusverlach schrieb:

    Jedoch in diesem Fall hat der Lernerfolg leider nicht eingesetzt.


    Hmm.

    VB.NET-Quellcode

    1. (dim rw As MitarbeiterRow)
    2. rw.Delete
    wie gesagt: Imo hätteste das im OB finden können.
    Hurra .. mein Rechner läuft wieder. Der Bube hatte mich die letzten Wochen ganz schön geärgert X(

    VaporiZed schrieb:

    Der Übergang zu dem von mir geschriebenen DataBinding ist ganz einfach, denn Du hast schon alle Zutaten.

    Lieben Dank, aber DataBinding an sich ist nicht das Problem gewesen ;)

    VaporiZed schrieb:

    Im UserControl wählst Du z.B. Label2 an (an der Benennung der Controls solltest Du noch arbeiten )

    Da es nur für dieses Problem ein Beispielprojekt war, hatte ich auf eine vernünftige Benennung der Controls verzichtet.

    Vervollständiger müsste es dann so aussehen

    VB.NET-Quellcode

    1. Private _row As endlosformDataSet.PostRow
    2. Public Property Row As endlosformDataSet.PostRow
    3. Get
    4. Return _row
    5. End Get
    6. Set(value As endlosformDataSet.PostRow)
    7. _row = value
    8. PostBindingSource.DataSource = value
    9. End Set
    10. End Property


    ErfinderDesRades schrieb:

    (dim rw As MitarbeiterRow)
    rw.Delete

    Sorry, aber ich kapiere es immer noch nicht. ?(
    P.S. ich wollte auch in Tabelle Post im Unterformular (User Control) einen Datensatz löschen, deren ID bekannt ist.
    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:


    ErfinderDesRades schrieb:

    (dim rw As MitarbeiterRow)
    rw.Delete

    Sorry, aber ich kapiere es immer noch nicht. ?(
    Das kapier ich nicht, wie man das nicht kapieren kann.
    Wenn du eine MitarbeiterRow hast, dann kannst du sie mit ihrer .Delete-Methode löschen - die ist da bereits eingebaut.
    Eine ID brauchst du dazu nicht zu wissen. Einfach aufrufen: rw.Delete(), dann ist die rw deleted (mitsamt ihrer ID natürlich)

    ErfinderDesRades schrieb:

    Das kapier ich nicht, wie man das nicht kapieren kann.

    Weil ich diese Fehlermeldung habe und daher denke, irgendwas mache ich immer noch falsch.
    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
    Der Code in dem Screenshot ist jetzt aber auch nicht grad sinnvoll.
    Du musst schon eine Row hernehmen, die existiert, um diese auch löschen zu können.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.