Filter nach Name und Zählen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Filter nach Name und Zählen

    Hallo ,
    Wie kann ich Daten von DGV nach Name Filter und zusammenzählen in eine DGV 2.

    z.B.
    DGV1 Columns (1) Name oder ID, Columns (3) True oder False
    Typ;Datum;True/False;Eb_1;Eb1_x;Eb1_y;Eb1_°;Eb2_;Eb2_x;Eb2_y;Eb2_°;stat;stat_x;stat_y;stat_°
    Vl 456;02.09.2020 16:13;False;11,5;36;-126;188,8;47;-2;30;16,4;33,4;22;-69;19,1
    AG 1800;02.09.2020 16:14;True;6,1;28;47;332,9;20,6;-5;-14;148,4;13,4;15;24;146,3
    AG 1800;02.09.2020 16:14;True;1,8;5;11;19,6;5,3;0;-2;148,3;4,1;6;4;126,8
    Ad 4CM;02.09.2020 16:15;True;4,8;8;78;116,2;29,1;11;5;172,8;32;15;69;165,6
    AG 1800;02.09.2020 16:16;True;8,5;19;56;336,3;21,8;-8;-19;160,9;12;6;24;164,4

    Auf DGV 2
    Name/ True / False / Prozent
    VL 456 / 10 / 2 / 16,6%
    AG 1800/ 25 / 5 / 16,6%


    wie kann ich das ausgeben.
    Bilder
    • DGV.JPG

      23,37 kB, 509×119, 86 mal angesehen

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

    Hallo,

    viele Wege führen nach Rom.
    Du könntest die Zeilen des DGV1 durchlaufen und diese dann an DGV2 hinzufügen mit For Each und nach deinem Kriterien.

    Wenn es Datenbindung gibt (Access, Mysql, SQL-Server etc.) könnte man den Bindigsource Filter nutzen.


    VG Nerf
    Importiert wird eine.csv?
    Wie und wann werden den die Filterkriterien für den Namen den festgesetzt?
    Ich gehe davon aus das du eine Form hast in der 2 DGV sind und irgendwo Comboboxen oder TextBoxen? List etc. hast um den Filter zu setzen?

    wie gesagt das durchlaufen von DGV1 via For ist eine Möglichkeit, wenn die Kriterien schon da sind vorm Import der Daten dann könntest du es auch direkt beim Import schon machen.
    sowie Erfinderdesrades erwähnt hat, die Daten werden in einer CSV Datei importiert.
    Ich habe zuerst eine Datatable, Datatable wird in Datagridview und natürlich ID (Name) wird eine Liste erstellt.

    Datatable: thedatatable
    Datagridview: Datagridview1
    ID (Name): Columns(0)
    True/False: Columns(2)

    Ich denke, zuerst New Datatable erstellt.
    With thedatatable
    .Columns.Add("Name", System.Type.GetType("System.String"))
    .Columns.Add("True", System.Type.GetType("System.String"))
    .Columns.Add("False", System.Type.GetType("System.String"))
    end with
    Erste Name aus der Liste durch die Schleife "True" gesucht bzw. gezäht und geschrieben dann die "False".
    Mit Schleife
    2 Name...
    3 Name...
    Datagridview2= New Datatabel

    VB.NET-Quellcode

    1. Dim row As DataRow = thedatatable.NewRow
    2. row.Item("Name") = ""
    3. thedatatable.Rows.InsertAt(row, 0)
    4. Dim names As List(Of String) = thedatatable.AsEnumerable() _
    5. .Select(Function(r) r.Field(Of String)("Name")) _
    6. .Distinct() _
    7. .ToList()
    8. names.Sort()
    9. ComboBox2.DataSource = names

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

    Ich für mein Teil werde da wohl nix meh investieren. Ich habe hier: CSV Datei auslesen nach Datum und Uhr Zeit ab 2. Zeile schon drauf hingewiesen, dass du eine Datenverarbeitung am Halse hast, und sowas muss man mit den dafür vorgesehenen Mitteln in Angriff nehmen, die ja bereitstehen.
    Inzwischen hat sich das Projekt munter weiter-entwickelt - immer in die falsche Richtung.
    Statt einer Datenverarbeitung hast du nun eine Datagridview-/ und Combobox- Verarbeitung, ohne architektonische Strukturierung.
    Das würde ich nicht weiter vorantreiben wollen.

    Toni_Edi schrieb:


    wie kann ich das machen?


    ich kann nur wiederholen siehe Post#54... Daten schnell auslesen von CSV Datei

    du hast bereits in deinem Code

    VB.NET-Quellcode

    1. For Each element In results
    2. '.... mach mit den Daten was, einen Zähler vielleicht
    3. next


    es würde auch nix bringen dir Linq zu zeigen mit 'Group' etc....
    wenn du denn bisherigen Code in dem anderen Thread nicht verstehst

    Toni_Edi schrieb:


    Hallo Kasi,
    kannst du bitte noch einmal Helfen?


    ich kann Helfen, aber Lernen wirst du nix dadurch.
    du hast den ersten Code nicht verstanden und diesen wirst du erst recht nicht verstehen (sorry wenn ich das so sage)

    ich kann nur wiederholen .. besorge dir Bücher oder schau dir Online Tut's an und Lerne davon,
    wenn du dort dann nicht weiter kommst, dann stelle Fragen

    hier der Code um zu zählen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form3
    4. Friend Class Toni
    5. Public Typ As String 'zb. AG 1900
    6. Public TrueFalse As String ' deine True/False spalte in der .CSV
    7. Public IsTrue As Integer ' für Counter True
    8. Public IsFalse As Integer ' für Counter False
    9. End Class
    10. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    11. Dim results = (From line In File.ReadAllLines("D:\TestFolder\Dataall.txt").Skip(1) _
    12. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    13. Select New With _
    14. {.Typ = fields(0), _
    15. .TrueFalse = fields(2)
    16. } _
    17. ).ToList
    18. Dim EndResult As List(Of Toni) = (
    19. From b In results.AsEnumerable()
    20. Where b.Typ.Length > 0
    21. Group b By GroupKey = b.Typ Into g = Group
    22. Select New Toni With {
    23. .Typ = GroupKey,
    24. .IsFalse = g.Where(Function(x) x.TrueFalse.Equals("False")).Count(),
    25. .IsTrue = g.Where(Function(x) x.TrueFalse.Equals("True")).Count()
    26. }).ToList()
    27. With DataGridView1
    28. .Columns.Add("Typ", "Type")
    29. .Columns.Add("True", "True")
    30. .Columns.Add("False", "False")
    31. End With
    32. 'Auswertung in Datagridview eintragen
    33. For Each group In EndResult
    34. DataGridView1.Rows.Add(group.Typ, group.IsTrue, group.IsFalse)
    35. Next group
    36. End Sub
    37. End Class

    VB.NET-Quellcode



    @Kasi,
    Hallo Kasi,

    Es funtioniert sehr gut :thumbup:

    Vielen Dank für die Unterstützung und Danke, dass du dir die Zeit genommen hast.
    Amazing!
    Ich bin dabei Online Videos anschauen und nach und nach werde ich mit einer Datenbank arbeiten.
    Trotz dem ich habe von dir sehr viel gelernt.
    Mein Problem war die Fragestellung.
    Aber du hast mich sofort verstanden.
    Manchmal hat mich sehr wehgetan, aber egal war für mich ein Motivation.

    Eine Frage habe ich noch,
    Ich will nicht alle Daten von CSV auslesen.
    Kann ich die Code mit erste Code verbinden?
    Da wo nach Datum und Uhr Zeit ließt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim results = (From line In File.ReadAllLines("C:\DATA\DATAALL_alles1.CSV").Skip(1)
    2. Let fields = line.Split(New Char() {";"c}).AsEnumerable()
    3. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso
    4. DateTime.Parse(fields.ElementAt(1)) <= toDate Select fields).ToArray()
    5. For Each element In results
    6. Dim NewRow As DataRow = thedatatable.NewRow
    7. NewRow("Name") = element(0)
    8. NewRow("Date/Time") = element(1)
    9. NewRow("True/False") = element(2)

    Bilder
    • DGV3.JPG

      54,47 kB, 558×397, 49 mal angesehen

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

    Toni_Edi schrieb:


    Manchmal hat mich sehr wehgetan, aber egal war für mich ein Motivation.

    Eine Frage habe ich noch,
    Ich will nicht alle Daten von CSV auslesen.
    Kann ich die Code mit erste Code verbinden?
    Da wo nach Datum und Uhr Zeit ließt.


    Hallo Toni,

    deine Anforderungen ändern sich ständig
    überlege genau was du mit dieser CSV erreichen willst,
    sollen diese nur Ausgewertet werden ? oder müssen diese Daten bearbeitet werden ?

    wenn du noch Pivottabellen davon haben möchtest wie in Post#3 angedeutet
    würde ich dir empfehlen diese CSV in eine einfache Access .mdb einzulesen, oder
    direkt mit einer Datenbank zu arbeiten.

    es ist schwierig zu Erahnen was dir noch einfällt, und was du machen willst.

    was sind das überhaupt für Daten, und woher kommen diese Daten?
    @Kasi,
    Hallo Kasi,
    auf die CSV Datei werden jeden Tag neue Daten geschrieben und ich wollte einlesen die Auswerten.
    1) Zeiteraum
    2) Zeitraum mit ID
    3) Nach dem einlesen Filter ich nach ID
    4) Zähle ich nach ID und True und FaleSoweit habe ich die fertig.
    Ich habe die Code angepasst.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub RadioButton2_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RadioButton2.CheckedChanged
    2. Dim fromDate As DateTime = DateTimePicker1.Value
    3. Dim toDate As DateTime = DateTimePicker2.Value
    4. Dim StartTime As DateTime = DateTimePicker3.Value
    5. Dim EndTime As DateTime = DateTimePicker4.Value
    6. DataGridView1.Visible = False
    7. DataGridView2.Visible = True
    8. ComboBox2.Visible = False
    9. Label10.Visible = False
    10. DataGridView2.Columns.Clear()
    11. DataGridView2.DataSource = Nothing
    12. DataGridView2.Rows.Clear()
    13. Dim results = (From line In File.ReadAllLines(TextBox1.Text).Skip(1)
    14. Let fields = line.Split(New Char() {";"c}).AsEnumerable()
    15. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso
    16. DateTime.Parse(fields.ElementAt(1)) <= toDate AndAlso
    17. DateTime.Parse(fields.ElementAt(2)) >= StartTime AndAlso
    18. DateTime.Parse(fields.ElementAt(2)) <= EndTime Select New With
    19. {.Typ = fields(0),
    20. .TrueFalse = fields(3)
    21. }
    22. ).ToList
    23. Dim EndResult As List(Of Toni) = (
    24. From b In results.AsEnumerable()
    25. Where b.Typ.Length > 0
    26. Group b By GroupKey = b.Typ Into g = Group
    27. Select New Toni With {
    28. .Typ = GroupKey,
    29. .IsFalse = g.Where(Function(x) x.TrueFalse.Equals("False")).Count(),
    30. .IsTrue = g.Where(Function(x) x.TrueFalse.Equals("True")).Count(),
    31. .Total = .IsFalse + .IsTrue,
    32. .percentage = .IsFalse / .Total * 100
    33. }).ToList()
    34. With DataGridView2
    35. .Columns.Add("Teilenummer", "Teilenummer")
    36. .Columns.Add("i.O.", "i.O.")
    37. .Columns.Add("n.i.O.", "n.i.O.")
    38. .Columns.Add("Gesamt", "Gesamt")
    39. .Columns.Add("Ausfall in %", "Ausfall in %")
    40. End With
    41. 'Auswertung in Datagridview eintragen
    42. For Each group In EndResult
    43. DataGridView2.Rows.Add(group.Typ, group.IsTrue, group.IsFalse, group.Total, group.percentage)
    44. Next group
    45. DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Gray
    46. DataGridView2.Columns.Item("Teilenummer").Width = 250
    47. DataGridView2.Columns.Item("i.O.").Width = 140
    48. DataGridView2.Columns("i.O.").HeaderCell.Style.ForeColor = Color.Green
    49. DataGridView2.Columns(2).HeaderCell.Style.ForeColor = Color.Red
    50. DataGridView2.Columns.Item("n.i.O.").Width = 140
    51. DataGridView2.Columns.Item("Gesamt").Width = 150
    52. DataGridView2.Columns.Item("Ausfall in %").Width = 150
    53. DataGridView2.Columns(4).DefaultCellStyle.Format = "0.0\" & "" & "%"
    54. End Sub

    Trozdem Habe ich eine Frage, kann man nach dem einlesen egal aus mdb oder aus CSV zähle von DGV?
    Mit deiner Hilfe ich so weit gekommen und viel gelernt.
    Sehr nett von dir, ich hoffe das bleibt so.
    Vielen Dank im voraus.

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

    sowas habe ich auch geschrieben.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​ Label3.Text = ""
    2. Label4.Text = ""
    3. Label5.Text = ""
    4. Dim xx As Integer = 1
    5. Dim xxX As Integer = 2
    6. Dim summe As Decimal = 0
    7. Dim summe2 As Decimal = 0
    8. For i As Integer = 0 To DataGridView2.Rows.Count - 1
    9. If DataGridView2.Rows(i).Cells(1).Value IsNot DBNull.Value Then
    10. summe += CDbl(DataGridView2.Rows(i).Cells(1).Value)
    11. End If
    12. If DataGridView2.Rows(i).Cells(2).Value IsNot DBNull.Value Then
    13. summe2 += CDbl(DataGridView2.Rows(i).Cells(2).Value)
    14. End If
    15. Next
    16. Label3.Text = summe
    17. Label4.Text = summe2


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Label3.Text = ""
    2. Label4.Text = ""
    3. Label5.Text = ""
    4. Dim xx As Integer = 2
    5. Label3.Text = (
    6. From Rows In DataGridView1.Rows.Cast(Of DataGridViewRow)()
    7. Where Not Rows.IsNewRow AndAlso Rows.Cells(xx).Value.ToString = "True"
    8. ).Count
    9. Label4.Text = (
    10. From Rows In DataGridView1.Rows.Cast(Of DataGridViewRow)()
    11. Where Not Rows.IsNewRow AndAlso Rows.Cells(xx).Value.ToString = "False"
    12. ).Count
    13. Dim Ausfall As Double
    14. Dim Summ1 As Double
    15. Summ1 = Val(Label3.Text) + Val(Label4.Text)

    Ich weiß nicht, wie man von DGV die Namen to List of String erstellt und danach True and False zählt.
    Fall wenn ich das brauche.

    Toni_Edi schrieb:


    Trozdem Habe ich eine Frage, kann man nach dem einlesen egal aus mdb oder aus CSV zähle von DGV?
    Mit deiner Hilfe ich so weit gekommen und viel gelernt.
    Sehr nett von dir, ich hoffe das bleibt so.
    Vielen Dank im voraus.


    hier eine gute Seite zum lernen, mit SQL kannst alles zählen und auch PIVOT Abfragen erstellen
    w3schools.com/sql/sql_groupby.asp