Wie stelle ich die Daten am besten in einem DGV da?

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von MR_NMS.

    Per Filter, indem Du schreibst:

    VB.NET-Quellcode

    1. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear) 'das steht ja schon im Code
    2. If RelevantDataRows.Sum(Function (x) x.Waschzahlen) = 0 Then Continue For 'neu dazu
    Ist natürlich die Frage, ob das für Dich eine Option ist, dass es ggf. Lücken in der Jahresreihenfolge gibt. Ich vermute zwar, dass es nicht so sein wird, dass z.B. 2016 und 2017 Zahlen da sind und 2018 plötzlich gar nichts. Aber das weißt Du besser.
    Auch möglich, falls Du quasi nur den Datenanfang brauchst:

    VB.NET-Quellcode

    1. Dim StartYear = UmsatzDS1.UmsatzDT.Where(Function(x) x.Waschzahlen > 0).Select(Function(y) y.Datum.Year).Min

    Du könntest zwar alternativ auch alle UmsatzDT-Zeilen rausnehmen, die keine Waschzahlen haben (Waschzahlen = 0), aber das hinterlässt Lücken dann beim Befüllen des DGVs. Von daher wahrscheinlich keine Option.
    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.
    Guten Morgen,
    wenn nichts im Jahr vorhanden ist, reicht eigentlich das dort für die Monate wo es keine Daten gibt eine Null eingetragen wird!

    werde ich später einmal ausprobieren.

    So!
    Die Jahre werden schon mal richtig aus dem DS geholt und auch durchlaufen.
    Jetzt habe ich aber wieder das alte Problem, das die JAhre durchlaufen werden und nur das letzte JAhr angezeigt wird!
    Denke mal, das die Schleife zum einfügen einer Spalte noch ergänzt werden muss!

    Steh auf dem Schlauch....




    VB.NET-Quellcode

    1. Dim StartYear = UmsatzDS1.UmsatzDT.Where(Function(x) x.Waschzahlen > 0).Select(Function(y) y.Datum.Year).Min 'neu dazu
    2. With DataGridView1
    3. For i As Integer = StartYear To Date.Today.Year
    4. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    5. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    6. If RelevantDataRows.Sum(Function(x) x.Waschzahlen) = 0 Then Continue For 'neu dazu
    7. .Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    8. .Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    9. For j = 1 To 12
    10. Dim CurrentMonth = j
    11. .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth).Sum(Function(y) y.Waschzahlen)
    12. .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth).Sum(Function(y) y.Waschzahlen)
    13. Next
    14. Next i
    15. End With

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

    MR_NMS schrieb:

    wenn nichts im Jahr vorhanden ist, reicht eigentlich das dort für die Monate wo es keine Daten gibt eine Null eingetragen wird!
    Dann fällt Zeile#8 wieder raus. Stattdessen etwas tiefer die 2. Schleife abwandeln

    VB.NET-Quellcode

    1. For j = 1 To 12
    2. Dim CurrentMonth = j
    3. .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = 0
    4. Dim UmsatzzeilenFuerAktuellenMonat = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth)
    5. If UmsatzzeilenFuerAktuellenMonat > 0 Then .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = UmsatzzeilenFuerAktuellenMonat.Sum(Function(y) y.Waschzahlen)
    6. Next


    MR_NMS schrieb:

    Jetzt habe ich aber wieder das alte Problem
    Wieviele Zeilen existieren, bevor Du den Importcode aufrufst? Wieviele sind sichtbar? Und ab welcher Zeile soll der Import starten? Vielleicht kommen wir so zu einer Lösung.


    MR_NMS schrieb:

    Denke mal, das die Schleife zum einfügen einer Spalte noch ergänzt werden muss!
    :cursing: . Ok, vielleicht reden wir aneinander vorbei. Wann sollen irgendwelche Spalten hinzugefügt werden?
    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.
    Alles nicht so einfach :(


    So soll es aussehen, wenn es einmal richtig läuft!

    Daten beginnen bei mir in der DS im Jahre 2008 und enden das weiß noch keiner!


    Das dgv soll zum anzeigen der Waschzahlen pro Monat für die einzelnen Jahre genutzt werden!
    Die Daten werden Tagesweise eingeben. Siehe tage



    Bilder
    • Ansicht.JPG

      322,3 kB, 3.790×815, 14 mal angesehen
    • tage.JPG

      111,69 kB, 393×1.634, 15 mal angesehen

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

    Jetzt bekomme ich bei dem neu eingesetzten Code folgende Meldung


    VB.NET-Quellcode

    1. If UmsatzzeilenFuerAktuellenMonat > 0

    Fehler BC30452 Der >-Operator ist für die Typen "EnumerableRowCollection(Of UmsatzDS.UmsatzDTRow)" und "Integer" nicht definiert.

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

    Richtig. Korrekt ist: If UmsatzzeilenFuerAktuellenMonat.Count > 0
    Ich halte fest: Jedes Jahr also eine neue Zeile. Die Spalten sind ja bereits mit 14 Stück vorgegeben. Spalte 1: die Jahre, Spalte 2: die Waschzahlen für das Jahr insgesamt, Spalte 3-14: die Waschzahlen für die jeweiligen Monate. Neue Spalten werden also nicht gebraucht und auch nicht erzeugt.

    Jetzt brauch ich noch die Antwort auf die Fragen

    VaporiZed schrieb:

    Wieviele Zeilen existieren, bevor Du den Importcode aufrufst? Wieviele sind sichtbar? Und ab welcher Zeile soll der Import starten? Vielleicht kommen wir so zu einer Lösung.
    und dann können wir das hiesige Problem soweit bald abschließen.
    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.
    "Vor dem Import sind keine Zeilen vorhanden!
    Mit einem Button wird der Import gestartet!
    Der Import startet mit dem StartYear und endet mit dem Date.today.year

    Ich halte fest: Jedes Jahr also eine neue Zeile. Die Spalten sind ja bereits mit 14 Stück vorgegeben. Spalte 1: die Jahre, Spalte 2: die Waschzahlen für das Jahr insgesamt, Spalte 3-14: die Waschzahlen für die jeweiligen Monate. Neue Spalten werden also nicht gebraucht und auch nicht erzeugt."


    Genau richtig!

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

    Dann zeig mal bitte die komplette Import-Sub. Ich vermute, dass sie stark dem Code aus Post#22 ähnelt, jedoch ist dort in Post#22 die Zeile nicht mehr drin, mit der dem DGV eine neue Zeile hinzugefügt wird.
    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.
    So sieht er aus!

    VB.NET-Quellcode

    1. Dim StartYear = UmsatzDS1.UmsatzDT.Where(Function(x) x.Waschzahlen > 0).Select(Function(y) y.Datum.Year).Min 'neu dazu
    2. With DataGridView1
    3. For i As Integer = StartYear To Date.Today.Year
    4. Dim CurrentYear = i 'sonst meckert der Compiler von wegen i in LINQ
    5. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    6. .Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    7. .Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    8. For j = 1 To 12
    9. Dim CurrentMonth = j
    10. .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = 0
    11. Dim UmsatzzeilenFuerAktuellenMonat = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth)
    12. If UmsatzzeilenFuerAktuellenMonat.Count > 0 Then .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = UmsatzzeilenFuerAktuellenMonat.Sum(Function(y) y.Waschzahlen)
    13. Next
    14. Next i
    15. End With
    Da fehlen aber noch Prozedurkopf und -ende. Und die Zeile, die schaut, was das Startjahr ist. :huh:
    In Zeile#7 fehlt bei Dir außerdem die DataGridView1.Rows.Add()-Zeile, die dafür sorgt, dass dem DGV eine neue, leere Zeile hinzugefügt wird.
    Ich hab mir das mal nachgebaut. Und damit funktioniert das, was Du haben willst:

    VB.NET-Quellcode

    1. Private Sub BtnImportDataToDgv_Click(sender As Object, e As EventArgs) Handles BtnImportDataToDgv.Click
    2. Dim StartYear = Tds.UmsatzDT.Where(Function(x) x.Waschzahlen > 0).Select(Function(y) y.Datum.Year).Min
    3. With DataGridView1
    4. For i = StartYear To Date.Today.Year
    5. Dim CurrentYear = i
    6. Dim RelevantDataRows = Tds.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    7. .Rows.Add()
    8. .Rows(DataGridView1.RowCount - 1).Cells(0).Value = CurrentYear
    9. .Rows(DataGridView1.RowCount - 1).Cells(1).Value = RelevantDataRows.Sum(Function(x) x.Waschzahlen)
    10. For j = 1 To 12
    11. Dim CurrentMonth = j
    12. .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = 0
    13. Dim UmsatzzeilenFuerAktuellenMonat = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth)
    14. If UmsatzzeilenFuerAktuellenMonat.Count > 0 Then .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = UmsatzzeilenFuerAktuellenMonat.Sum(Function(y) y.Waschzahlen)
    15. Next
    16. Next
    17. End With
    18. End Sub

    Die Daten sind Zufallsdaten, daher sind auch schon Waschzahlen für zukünftige Monate drin.
    Bilder
    • DgvWithResults.png

      7,09 kB, 893×145, 12 mal angesehen
    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.
    Zeig mal bitte die DGV-Einstellungen, die sich oben rechts hinter dem SmartTag vebergen.
    So muss es aussehen:

    Wenn bei [Hinzufügen] ein Häkchen ist, kommt das raus, was Du zeigst.
    Aber das hatte ich bereits in Post#10 (Stichwort "Koordinaten") geschrieben.
    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.