Die 10 höchsten Werte in einem Datagridview einfärben

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Die 10 höchsten Werte in einem Datagridview einfärben

    Hallo,

    ich möchte die 10 letzten/höchsten Werte in einer Datagridview-Spalte mit Hilfe des Cell_Paintevent einfärben.

    Wie das Einfärben funktioniert weiß ich, allerdings weiß ich nicht, wie ich Werte ermitteln kann.

    In der Spalte stehen DateTime Werte im Format "dd/MM/yyyy HH:mm:ss".

    Mein Ansatz wäre jetzt die Werte über ein SQL-Statement in meiner Datenbank abzufragen 'ala'

    SELECT

    FROM

    ORDER BY
    Timestamp DESC
    LIMIT
    10

    und anschließend diese Werte im DGV zu suchen und einzufärben.

    Gibt es da vielleicht eine elegantere Lösung? In Excel gibt es z.B. die Formatierung "Obersten 10", "obersten 10%" etc... Sowas suche ich.

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

    zuallererst: Wenn du die 10 höchsten Werte in deinem DGV einfärben willst, dann wäre es überaus dumm, irgendwas in der Datenbank abzufragen.
    Denn es geht um Werte in deinem DGV, nicht um Werte in der Datenbank.

    Und wie man einfärbt, weißt du?
    Das bezweifel ich, bzw. da gibt es vielerlei Ansätze, ein paar richtige und viele falsche - hier mal was richtiges: coloriertes DatagridView

    Und für diesen Sonderfall, wo die Colorierung jeder Zelle alle anderen Werte mitberücksichtigen muss, wirds nochmal extra-Kompliziert.

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

    hier mal was richtiges: coloriertes DatagridView


    So färbe ich bereits andere Spalten ein, dass klappt auch prima so.

    Mir geht es halt darum wie ich an die Werte komme. Gibt es dafür wie in EXCEL fertige Funktionen, oder muss ich mir da selbst was basteln?

    VB.NET-Quellcode

    1. If e.ColumnIndex = 8 Then
    2. Dim dates As New List(Of Date)
    3. For i = 0 To MainDataGridView.Rows.Count - 1
    4. dates.Add(CDate(MainDataGridView.Rows(MainDataGridView.Rows(i).Index).Cells(8).Value))
    5. Next
    6. Dim top10 = From d In dates
    7. Order By d Descending
    8. Take 10
    9. If top10.Contains(CDate(e.Value)) Then
    10. e.CellStyle.BackColor = Color.Orange
    11. End If
    12. End If


    Ok, habe es so gelöst. Kann /closed
    vereinfachung:

    VB.NET-Quellcode

    1. If e.ColumnIndex <> 8 Then Return
    2. Dim dates As New List(Of Date)
    3. For i = 0 To MainDataGridView.Rows.Count - 1
    4. dates.Add(CDate(MainDataGridView(8, i).Value))
    5. Next
    6. dates.Sort()
    7. e.CellStyle.BackColor =If(dates.IndexOf(CDate(e.Value), 10) >= 0, Color.Orange, MainDataGridView.DefaultCellstyle.BackColor)