DataSet, Zugriffe OHNE BindingSource ?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    DataSet, Zugriffe OHNE BindingSource ?

    Hallo liebe VB-Paradise Community,

    ich bin mir bewusst, dass es sich hierbei um ein relativ leidiges Thema handelt, daher wollte ich mal erläutern, was genau ich zu erreichen versuche, um evtl. eine "bessere" alternativ-Methode zu finden.
    Ein bekannter von mir, hat eine eigene Firma und möchte für sich selbst eine Art "Rechnungsprogramm" haben, dabei müssen lediglich einige Artikel (knapp 2 dutzend) einige wenige Mitarbeiter, und eine relativ große Menge an Kunden verwaltet werden.
    Der Grundgedanke hat mich natürlich in Richtung Datenbank (bzw. da einfach simpler, DataSet) geführt, jedoch haben sich hierbei einige Erinerungen hervorgehoben, als ich damals eine art Snippet-DB erstellte, wurde ich mehrfach darauf hingewiesen doch bitte mit Databinding/der Bindingsource zu arbeiten, was sich in meinem Fall als sehr problematisch darstellte, da ich sehr gerne ein ansprechendes GUI verwenden möchte, DGV z.B. ist absolut hässlich und für meine Bedürfnisse schlicht unbrauchbar. Des weiteren würde ich meine Zugriffe egal ob nun bei einem neuen Eintrag, oder z.B. natürlich auch einen Eintrag auszulesen, schlicht und ergreifend lieber manuel durchführen.

    Nun ist es so das ich mich quasi totgoogeln kann und ich dennoch keine Möglichkeit finde, richtig mit dem DataSet umzugehen, da die meisten (wenn nicht gar alle) Tutorials immer in richtung DGV und dergleichen zeigt.
    Um z.B. einen neuen Eintrag zu erstellen, fand ich (auch bereits entsprechend angepasst) folgendes:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim NewDSRow = DataSet.dt_Diesel.NewRow
    2. NewDSRow("Datum") = DateTime.Now.Date 'selbsterklärend
    3. NewDSRow("Uhrzeit") = DateTime.Now.TimeOfDay 'selbsterklärend
    4. NewDSRow("PreisProLiter") = DPPL ' diese Variable enthält einen Double (aktueller Diesel Preis per Liter)
    5. NewDSRow("PreisProKilometer") = DPPK ' diese Variable enthält einen Double (aktueller Diesel Preis per Kilometer)
    6. DataSet.dt_Diesel.Rows.Add(NewDSRow)


    jedoch habe ich im Tutorial von @ErfinderDesRades gelesen, das dies dann wohl so genannte untypisierte Zugriffe seien und das doch eher sowohl ungewünscht als auch unpraktisch ist. Zum auslesen der jeweiligen Einträge wiederum fand ich bisher gar nichts was ich in ettlichen versuchsstunden zum laufen gebracht hätte.

    Daher ergeben sich folgende Fragen für mich:
    1. Macht der Ansatz mit einem Dataset überhaupt Sinn, oder soll ich mir lieber einfach .txt-Dateien erstellen und entsprechend füllen ?
    2. Wenn doch ein DataSet Sinn macht, wie kann ich einträge "korrekt" Anlegen (typisiert ?)
    3. Wie kann ich die Einträge entsprechend auslesen ? (ja ich habe dazu Ansätze gefunden, diese setzen jedoch anscheinend weiteres vorraus, da diese immer so etwas wie "row.current" voraussetzen, was bei rein manuellen Zugriffen ja nicht klar ist ?!?)

    Ich hoffe das einigermaßen verständlich ist was ich meine/zu erreichen versuche, und das mir jemand hierbei einige Denkanschläge bzw. Ideen geben kann.


    Lieben Gruß an alle und danke euch =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Sollten in deinem Rechnungsprogramm Rechnungen geschrieben werden? Falls ja, setze dich mit der GOBD (Pflicht in D) auseinander. Wenn du das nicht sauber hin bekommst, kommt dein Kumpel in Teufels Küche. Sollten dort keine Rechnungen geschrieben werden, soll sich dein Bekannter nen Rechnungsprogramm kaufen, was die anderen (welche du programmieren willst) Features abdeckt. Word und Co. Sind übrigens nicht GOBD konform...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich geh mal nur auf das programmiertechnische ein:
    Zu Frage#1: tDS ist schon ne richtig feine Sache, wenn man sie einmal erfolgreich nutzen kann. Aber diese Aussage ist Ansichtssache, daher zum nächsten Punkt.
    Zu Frage#2: Das Anlegen erfolgt - wie es in den VVV (vier-Views-Videos) zu sehen war (Generier-Funktion) - über DeineTdsInstanz.NameDeinerDataTable.Add_NameDeinerDataTable_Row(ParameterMitTypenUndReihenfolge), also bei folgender DataTable

    z.B. mit

    VB.NET-Quellcode

    1. Tds.Cars.AddCarsRow("WV Handball", 450, Drawing.Color.AliceBlue.ToArgb, 45000)

    Name als String; PowerInPS, CarColor, PriceInEuros als Integer
    Zur Frage#3: row.current ist dann nur relevant, wenn Du an Daten gebundene CEs verwendest, da dann auch meist eine BindingSource im Spiel ist, die sich dann um vieles kümmert. Musst Du aber nicht haben. Du kannst auch über andere Zeilen zum Ziel gelangen, z.B.:

    VB.NET-Quellcode

    1. TextBox1.BackColor = Drawing.Color.FromArgb(Tds.Cars(0).CarColor)
    2. TextBox1.Text = Tds.Cars(1).Name
    3. TextBox2.Text = Tds.Cars.Select(Function(x) x.PriceInEuros).Sum.ToString 'Auswahl per LINQ; die Summe aller in der DataTable gespeicherten Autopreise.



    btw: Das DGV ist praktisch und kann in diversen Schritten sehr hübsch gemacht werden. Eine Verwendung bei Nutzung eines tDS ist aber keine Pflicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed Danke dir schon mal für die Hilfestellung, nach deiner Methode komme ich bisher ganz gut klar, mir ist nur aufgefallen, das ich mit der Zeile:

    VB.NET-Quellcode

    1. Tds.Cars(1).Name


    die 1 als Index sehen muss, aber ich würde das sehr gerne über die Spalte: ID filtern, mir fällt dazu allerdings kein alternativer Ansatz ein

    z.B.

    VB.NET-Quellcode

    1. Dim selectedInfo() As String = ListBox1.SelectedItem.ToString.Split(CType(" ", Char))
    2. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Vorname = txt_Vorname.Text ' CType(selectedInfo(0), Integer) enthält z.B. die 7 da das die ID des eintrages ist, aber wenn jetzt z.b. nur 2 Einträge vorhanden sind da die anderen entfernt wurden, will er auf den 7ten eintrag zugreifen welcher aber ja nicht mehr existiert.
    3. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Nachname = txt_Nachname.Text
    4. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Handynummer = txt_Handy.Text
    5. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Bruttogehalt = nud_Bruttogehalt.Value





    Lieben Gruß

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    VB.NET-Quellcode

    1. Dim selectedInfo() As String = ListBox1.SelectedItem.ToString.Split(CType(" ", Char))
    Das kannst Du auch zu folgendem kürzen:

    VB.NET-Quellcode

    1. Dim selectedInfo() As String = ListBox1.SelectedItem.ToString.Split(" "c)


    VB.NET-Quellcode

    1. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Vorname
    zu

    VB.NET-Quellcode

    1. Form1.DataSetDB.table_Mitarbeiter(Integer.Parse(selectedInfo(0)).Vorname


    ##########

    Oder eben gleich:

    VB.NET-Quellcode

    1. Dim CurrentID = Integer.Parse(selectedInfo(0)
    2. Form1.DataSetDB.table_Mitarbeiter(CurrentID).Vorname = txt_Vorname.Text
    3. Form1.DataSetDB.table_Mitarbeiter(CurrentID).Nachname = txt_Nachname.Text
    4. Form1.DataSetDB.table_Mitarbeiter(CurrentID).Handynummer = txt_Handy.Text
    5. Form1.DataSetDB.table_Mitarbeiter(CurrentID).Bruttogehalt = nud_Bruttogehalt.Value
    Allerdings versteh ich nicht ganz, warum Du irgendwelche Indices aus nem ListView rauspuhlen willst. Durch ein schön gestyltes (ggf. ListView-ähnliches) DGV und DataBinding musst Du codetechnisch diesbezüglich gar nix mehr machen. Aber das ist ne andere Geschichte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    Ich würde es mit ner Dataset / Binding und ner DGV machen, die Textboxen kannst du auch an die Dataset Binden. Später beim Filtern der Daten kannst du diese ganz einfach mit einem Rowfilter Filtern.
    Auch wirst du es einfacher haben die Daten zu speichern, da du die Dataset mit einem einfachen Befehl speichern kannst und im Xlm format hast. Was dir dann noch die Vorteile bring diese relativ einfach in eine SQL Datenbank zu übertragen.

    Auch kannst du Tabellen für Stücklisten oder Bestellungen später in einem Dataset über Code erstellen, was dir die Arbeit sehr vereinfacht. Wenn dein Kumpel bsp. Artikel auf seiner HP anzeigen will ist dies auch einfach über die Xlm möglich, da alle Infos zu den Artikeln schon drinne stehen und über Java nur noch auseinander genommen werden müssen.

    asusdk schrieb:

    VB.NET-Quellcode

    1. Form1.DataSetDB.table_Mitarbeiter(CType(selectedInfo(0), Integer)).Nachname = txt_Nachname.Text
    Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Wenn Du ggf. mehrere Instanzen von Form1 hast, greifst Du iwann die falsche und wunderst Dich, dass die Daten nicht da sind, wo sie sein sollen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!