DGV höchster Wert farbig markieren

  • VB.NET

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

    DGV höchster Wert farbig markieren

    Hallo Zusammen!
    Ich habe ein DGV indem ich erfasste Zahlen anzeige.
    Nun möchte ich gerne, das immer die höchste Zahl ein einer Spalte farbig markiert wird.

    So habe ich es bisher versucht, es werden die Spalten durchlaufen, aber nicht farbig markiert!

    VB.NET-Quellcode

    1. Dim HoechsteZahl As Integer = Integer.MaxValue
    2. Dim KleinsteZahl As Integer = Integer.MinValue
    3. Dim Value As Integer
    4. Dim Farbe As Color = DataGridView1.CurrentRow.DefaultCellStyle.BackColor
    5. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    6. For Each Zeile As DataGridViewRow In Me.DataGridView1.Rows
    7. Value = Zeile.Cells("Summe").Value
    8. If HoechsteZahl < Value Then
    9. DataGridView1.FirstDisplayedScrollingRowIndex = i
    10. DataGridView1.Rows(i).Selected = Farbe = Color.Red
    11. ElseIf KleinsteZahl > Value Then
    12. DataGridView1.FirstDisplayedScrollingRowIndex = i
    13. DataGridView1.Rows(i).Selected = Farbe = Color.Yellow
    14. End If
    15. Next
    16. Next


    Wie stelle ich es an, das die höchste Zahl in der Spalte farbig markiert wird?
    If HoechsteZahl < Value Then Das ist inhaltlich unsinnig, wenn Du HoechsteZahl auf Integer.MaxValue setzt. Value kann dann niemals größer als HoechsteZahl werden, wenn Value ein Integer ist. Wenn, dann müsstest Du HoechsteZahl mit Integer.MinValue initialisieren. Entsprechend auch verfahren mit KleinsteZahl. Ggf. liegt das auch an der nicht-optimalen Benennung der Variablen. Statt HoechsteZahl wäre wohl sinnvoller z.B. BisherHoechsteAufgetreteneZahl.

    btw: Option Strict Off? Denn Value = Zeile.Cells("Summe").Value Das Cell.Value ist doch vom Typ Object.
    Es wird außerdem nirgends die Farbe geändert. z.B. die Zeile DataGridView1.Rows(i).Selected = Farbe = Color.Yellow sagt aus: "Der selektiert-Zustand der Zeile i ist genauso wahr (oder falsch) wie die Tatsache, dass Farbe (also die DataGridView1.CurrentRow.DefaultCellStyle.BackColor) = Gelb ist."

    ##########

    Letztenendes musst Du die in der Spalte nur den Index der Zeilen merken, wo Value den größten Wert hat (-> IndexOfRowWithHighestValue) und die, wo Value den kleinsten Wert hat (-> IndexOfRowWithLowestValue). Und nach der Schleife nimmst Du die beiden Zeilen her und färbst sie ein.
    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 3 mal editiert, zuletzt von „VaporiZed“ ()

    Mit folgendem Code durchlaufe ich die Spalte "Summe"
    Beim Durchlaufen wird bei Value immer der aktuelle Wert vom Durchlauf angezeigt!
    Wie bekomme ich es jetzt hin, das nach dem durchlauf die Höchste Zahl farbig markiert wird?
    In diesem Beispiel die 66303...

    VB.NET-Quellcode

    1. Dim Value As Integer
    2. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    3. For Each Zeile As DataGridViewRow In Me.DataGridView1.Rows
    4. Value = Zeile.Cells("Summe").Value
    5. Next
    6. Next
    Bilder
    • Ansicht.JPG

      105,09 kB, 597×1.216, 70 mal angesehen
    OK!
    Mache ich es erst einmal!

    VB.NET-Quellcode

    1. Dim Value As Integer
    2. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    3. For Each Zeile As DataGridViewRow In Me.DataGridView1.Rows
    4. Value = CInt(Zeile.Cells("Summe").Value)
    5. Next
    6. Next



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

    MR_NMS schrieb:

    Wie bekomme ich es jetzt hin, das nach dem durchlauf die Höchste Zahl farbig markiert wird?

    Zuerst einmal dein Projekt auf Option Strict ON stellen...
    Dann schaue dir einmal das DGV-Cell-Painting-Event an - da kannst du DGV-Zellen färben...
    Und zwar in Abhängigkeit eines Maximalwertes, den du zuvor aus deiner Daten-Column errechnen musst...
    Bitte berechne das jetzt nicht über das DGV über sämtliche Zellen, sondern verwende deine zu grunde liegende Tabelle, an das du dein DGV gebunden hast!
    HI!
    Habe ich umgestellt!

    So bekomme ich die Daten für die Anzeige!


    VB.NET-Quellcode

    1. Dim StartYear = UmsatzDS1.UmsatzDT.Where(Function(x) x.Waschzahlen > 0).Select(Function(y) y.Datum.Year).Min
    2. With DataGridView1
    3. For i = StartYear To Date.Today.Year
    4. Dim CurrentYear = i
    5. Dim RelevantDataRows = UmsatzDS1.UmsatzDT.Where(Function(x) x.Datum.Year = CurrentYear)
    6. .Rows.Add()
    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 = 0
    12. Dim UmsatzzeilenFuerAktuellenMonat = RelevantDataRows.Where(Function(x) x.Datum.Month = CurrentMonth)
    13. If UmsatzzeilenFuerAktuellenMonat.Count > 0 Then .Rows(DataGridView1.RowCount - 1).Cells(j + 1).Value = UmsatzzeilenFuerAktuellenMonat.Sum(Function(y) y.Waschzahlen)
    14. Next
    15. Next
    16. End With

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

    Du hattest es doch schon fast.
    Schleife durch alle Zeilen. Wert in der Summenspalte mit der höchsten bekannten Zahl vergleichen. Wenn Wert > höchste bekannte Zahl, dann diese Zahl als neue höchste bekannte Zahl merken und Zeile merken.
    Das gleiche mit kleinster bekannter Zahl.
    Nach der Schleife die Zeile mit der höchsten und der kleinsten bekannten Zahl über die beiden Indices, die Du Dir gemerkt hast, einfärben. Fertig.
    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.
    Versuche Punkt für Punkt umzusetzen. Wo scheitert es?
    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.

    Quellcode

    1. Dim DerzeitHoechsterWert = 0
    2. Dim ZeilenindexMitHoechstemWert = -1
    3. Deine Schleife
    4. Wenn Wert in Zeile i > DerzeitHoechsterWert, dann DerzeitHoechsterWert = Wert in Zeile i: ZeilenindexMitHoechstemWert = i
    5. Schleifenende
    6. Farbe von Zeile mit Index = ZeilenindexMitHoechstemWert wird gelb
    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.
    Die Höchste Zahl bekomme ich jetzt heraus und lasse sie mir anzeigen!
    Nun kommt das einfärben ??

    VB.NET-Quellcode

    1. Dim HoechsteZahl = 0
    2. Dim Value As Integer
    3. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    4. For Each Zeile As DataGridViewRow In DataGridView1.Rows
    5. Value = CInt(Zeile.Cells("Summe").Value)
    6. If HoechsteZahl < Value Then
    7. HoechsteZahl = Value
    8. End If
    9. Next
    10. Next
    11. MsgBox(String.Format(CType(HoechsteZahl, String)))
    Du willst Dir doch die höchste Zahl gar nicht anzeigen lassen. Du willst den Zeilenindex, wo der höchste Wert ist.
    Schreib in Zeile#4: Dim ZeilenindexMitHoechstemWert = -1
    Und in Zeile#10: ZeilenindexMitHoechstemWert = i
    Und am Ende nimmst Du die Zeile mit dem ZeilenindexMitHoechstemWert her und gibst per Style die BackColor an.

    Öhm ... Was soll die doppelte For-Schleife? Du brauchst nur die For i-Schleife. Die For-Each-Schleife kann weg. Und dann schreibst Du in Zeile#7 stattdessen: Value = CInt(DataGridView1.Rows(i).Cells("Summe").Value) - obwohl man das auch noch besser schreiben könnte, aber sei's drum.
    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.
    Beim ???? stehe ich noch auf dem Schlauch :)

    VB.NET-Quellcode

    1. Dim HoechsteZahl = 0
    2. Dim ZeilenindexMitHoechstemWert = -1
    3. Dim Value As Integer
    4. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    5. Value = CInt(DataGridView1.Rows(i).Cells("Summe").Value)
    6. If HoechsteZahl < Value Then
    7. HoechsteZahl = Value
    8. ZeilenindexMitHoechstemWert = i
    9. End If
    10. DataGridView1.Rows(????????????).Cells("Summe").Style.BackColor = Color.Gray
    11. Next
    Ersetze Deine ?????????? durch ZeilenindexMitHoechstemWert , verschiebe jene Zeile hinter/unter das Next und fertig.
    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.
    Jetzt wird die Höchste Zahl markiert :)

    Danke


    Kann ich jetzt noch eine weitere Schleife einsetzen und für die restlichen Monate auch die Höchste Zahl zu markieren?
    Bilder
    • Ansicht.JPG

      348,85 kB, 2.230×1.205, 56 mal angesehen

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

    Jetzt erweitere den Code erstmal um die Zeile mit dem kleinsten Wert - ohne eine neue Schleife einzubauen.

    MR_NMS schrieb:

    Kann ich jetzt noch eine weitere Schleife einsetzen und für die restlichen Monate auch die Höchste Zahl zu markieren?
    Können im Sinne von dürfen: ja klar, Du kannst so viele Schleifen machen wie Du willst. Können im Sinne von wissen, wie es geht: tja, sag Du es uns.
    Aber ich versteh die Frage nicht. Zeig mal im Bild, was jetzt wo unter welchen Umständen zusätzlich markiert werden soll.
    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.
    Nun wird der Höchste und kleinste Wert markiert!
    Es sollen aber auch bei den anderen Monaten markiert werden!


    VB.NET-Quellcode

    1. Dim HoechsteZahl = 0
    2. Dim KleinsteZahl = 999999
    3. Dim ZeilenindexMitHoechstemWert = -1
    4. Dim ZeilenindexMitKleinstemWert = -1
    5. Dim Value As Integer
    6. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    7. Value = CInt(DataGridView1.Rows(i).Cells("Summe").Value)
    8. If HoechsteZahl < Value Then
    9. HoechsteZahl = Value
    10. ZeilenindexMitHoechstemWert = i
    11. ElseIf KleinsteZahl > Value Then
    12. KleinsteZahl = Value
    13. ZeilenindexMitKleinstemWert = i
    14. End If
    15. Next
    16. DataGridView1.Rows(ZeilenindexMitHoechstemWert).Cells("Summe").Style.BackColor = Color.LightGreen
    17. DataGridView1.Rows(ZeilenindexMitKleinstemWert).Cells("Summe").Style.BackColor = Color.LightBlue
    Bilder
    • Ansicht.JPG

      479,27 kB, 3.090×1.204, 46 mal angesehen