Farbliches auseinanderhalten aufeinanderfolgender Zellenihalt mit Randomfunktion der Farbe

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von thelightsense.

    Farbliches auseinanderhalten aufeinanderfolgender Zellenihalt mit Randomfunktion der Farbe

    Hallo Leute, eventuell kann mir jemand helfen ... ich komme mit einem Programm nicht weiter.

    Ausgangslage: Ein GridView hat eine Spalte mit Bestellungen. Die Bestellungen sind pro Artikel, es kann also mehrere Artikel pro Bestellung geben sieht so aus:

    Nr.
    Artikel
    Bestellung
    1
    Monitor
    08.08.2018-Nr1
    2
    Monitorkabel
    08.08.2018-Nr1
    3
    Monitorfuß
    08.08.2018-Nr1
    4
    PC Komplett
    09.08.2018-Nr1
    5
    Festplatte
    10.08.2018-Nr1
    6
    Festplattenkabel
    10.08.2018-Nr1

    Soweit, sogut. Damit ich hier nicht den Überblick verliere welche Bestellungen zusammen gehören und
    welche von anderen Kunden sind lasse ich folgenden Visual Studio Code darüberlaufen:

    Dim i As Integer

    Dim DRV As DataRowView
    Dim DRVnext As DataRowView

    For i = 0 To AbfrageBindingSource.Count - 2
    DRV = AbfrageBindingSource(i)
    DRVnext = AbfrageBindingSource(i + 1)

    If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then
    AbfrageDataGridView.Rows(i).Cells(1).Style.BackColor = Color.Chocolate
    AbfrageDataGridView.Rows(i + 1).Cells(1).Style.BackColor = Color.Chocolate
    End If
    Next

    Sieht dann so aus:

    Nr
    Artikel
    Bestellung
    1
    Monitor
    08.08.2018-Nr1
    2
    Monitorkabel
    08.08.2018-Nr1
    3
    Monitorfuß
    08.08.2018-Nr1
    4
    PC Komplett
    09.08.2018-Nr1
    5
    Festplatte
    10.08.2018-Nr1
    6
    Festplattenkabel
    10.08.2018-Nr1

    Soweit, sogut. Die Schleife geht die Zellen durch und schaut, ob sie mit der nächsten Vergleichbar ist.
    Ist der Inhalt vergleichbar, werden beide eingefärbt. Kommt die Schleife hier zu Nr. 4 ist diese nicht
    mehr gleich Nr. 3 und 4 bleibt somit unbehandelt.

    Jetzt zum Problem es wird unübersichtlich, wenn ich viele Bestellungen an einem Tag habe und ALLES
    in einer Farbe markiert ist. Ich habe etliche Randomfunktionen probiert um erst rot, nächsten matches
    dann grün und wieder rot zu bekommen aber komme einfach nicht weiter .... eventuell hilft mir jemand
    auf die Sprünge kann ja eigentlich nicht ganz schwer sein.

    Sollte so aussehen (zwei Farben genügen völlig, gern aber mehr :D :(

    Nr
    Artikel
    Bestellung
    1
    Monitor
    08.08.2018-Nr1
    2
    Monitorkabel
    08.08.2018-Nr1
    3
    Monitorfuß
    08.08.2018-Nr1
    4
    PC komplett
    09.08.2018-Nr1
    5
    Festplatte
    10.08.2018-Nr1
    6
    Festplattenkabel
    10.08.2018-Nr1


    Vielen Dank
    Warum mit Zufallsgenerator arbeiten? Du hast 3 Farben: schwarz, rot, gold ( :P ). Dann kreise durch die Farben einfach durch, wenn ne Bestellungsungleichheit kommt:

    VB.NET-Quellcode

    1. Dim ColorList As New List(Of Drawing.Color)
    2. Dim IndexOfColorToUse As Integer = 0
    3. '...
    4. ColorList.AddRange({DrawingColor.Black, DrawingColor.Red, DrawingColor.Chocolate})
    5. '...
    6. 'Wenn Du dann auf nen Bestellswitch triffst:
    7. IndexOfColorToUse = (IndexOfColorToUse + 1) Mod 3
    8. AbfrageDataGridView.Rows(i).Cells(1).Style.BackColor = ColorList(IndexOfColorToUse)


    btw: Örks. Untypisierter Datenzugriff. Aber wurscht. Welche Codezeile? Keine Ahnung, da Du Deinen Code nicht in CodeTags gesetzt hast und somit kein Codeblock entsteht.
    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.
    @thelightsense Gib der Tabelle eine Spalte mit dem Unterscheidungsmerkmal, wonach Du die Farbunterschiede generieren willst.
    Im DGV machst Du diese Spalte unsichtbar (.Visible = False).
    Dann sortierst Du das DGV nach dieser unsichtbaren Spalte.
    Dann legst Du die erste Farbe fest und gehst Du diese Spalte von oben nach unten und bei jedem Wechsel der Eigenschaft nimmst Du die nächste Farbe.
    Feddich.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi @VaporiZed und @RodFromGermany !!!

    Danke für die schnelle und hilfreiche Unterstützung!! Funzt noch nicht so ganz ... es wird jetzt die erste ROW
    black, die nächste rot und dann schokolade xD

    wenn es nicht zutrifft das mehrfache Einträge sind bleibt es weiß, schon ein schritt weiter als vorher vielen Dank

    Wie kann ich es so verbessern, dass pro Match eine Farbe bleibt .. das ist nämlich exakt der Punkt
    an dem ich hänge ... die Logik macht es mir schwer eine Schleife zu bilden.

    hier meine Schnippsel::


    Dim ColorList As New List(Of Drawing.Color)
    Dim IndexOfColorToUse As Integer = 0

    Sub findediedopplten()
    Dim i As Integer
    Dim DRV As DataRowView
    Dim DRVnext As DataRowView
    Dim drawingcolor As Color

    ColorList.AddRange({drawingcolor.Black, drawingcolor.Red, drawingcolor.Chocolate})

    For i = 0 To AbfrageBindingSource.Count - 2

    If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then

    IndexOfColorToUse = (IndexOfColorToUse + 1) Mod 3
    AbfrageDataGridView.Rows(i).Cells(1).Style.BackColor = ColorList(IndexOfColorToUse)

    End If
    Next

    End Sub
    Deine Sätze sind etwas ... schwierig. Ich muss sie Dank fehlender Interpunktion mehrfach lesen, bis ich glaube sie verstanden zu haben.
    Wenn der Code für jede Farbe eine neue Farbe erzeugt, also es immer geht Schwarz-Rot-Gold-Schwarz-Rot-Gold-Schwarz-Rot-Gold, dann ist Dein Vergleichscode Grütze. If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then: Da kommt mir der Vergleich sehr portugiesisch vor. Prüf bitte erstmal, ob der Überhaupt gleiche Bestellungen als solche erkennt. Wenn man von der komischen Syntax absieht: Wo wird zugeordnet, was konkret DRV.Item("Bestellung") und DRVnext("Bestellung") innerhalb der Schleife ist? Muss sich doch bei jeden Schleifendurchgang ändern. Macht es aber laut dem Code nicht.

    Noch was: Die Zeile ColorList.AddRange({drawingcolor.Black, drawingcolor.Red, drawingcolor.Chocolate}) sollte nur bei Programmstart, also 1x ausgeführt werden, sonst hast Du bei jedem Aufruf der findediedopplten-Sub wieder 3 zusätzliche Farben drin.

    btw: 1. Bitte CodeTags verwenden, 2.: findediedopplten: ich musste es 3x lesen, um es zu verstehen. Nutze ggf. CamelCase (FindeDieDoppelten).
    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“ ()

    sorry wenn ich mich da etwas unbeholfen ausdrücke! Ich versuche es anders:

    Die Codezeile:

    VB.NET-Quellcode

    1. If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then

    funktioniert. Da können Bestellnummern drin stehen ohne Datum egal was!

    Mein Code aus dem ersten Post sieht sich Zelleninhalt für Zelleninhalt an (von oben nach unten alle Bestellnummern jeder ROW), und prüft
    ob es Übereinstimmungen gibt.
    Gibt es eine Zelle mit Inhalt, die gleich dem Inhalt der vorherigen geprüften Zelle ist, färbe
    es in Schokoladenfarbe. (siehe Post 1 Tabelle Monitor und Festplatte)

    VB.NET-Quellcode

    1. If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then
    2. AbfrageDataGridView.Rows(i).Cells(1).Style.BackColor = Color.Chocolate
    3. AbfrageDataGridView.Rows(i + 1).Cells(1).Style.BackColor = Color.Chocolate
    4. End If


    Ist ein Zelleninhalt nicht der gleiche wie der letzte, dann tut die Schleife nix, Zelle bleibt weiß.
    (Tabelle aus Post 1, der PC Komplett hat eine andere Bestellnummer als der Monitorfuß, keine Farbe)

    Der Code ließt jetzt die Nr 5 und merkt, ist wieder anders als Nr 4, also mach wieder nix.

    JETZT KOMMT DER HARKEN !!!

    Bei Nr 6 merkt die Schleife, Nr 6 ist aber gleich Nr 5, also wieder einfärben! Bis hierhin ist alles super und
    ok, aber ich will jetzt nicht mehr chokolade haben, sondern grün als Farbe !!!

    Siehe Post 1, letzte Tabelle

    ................... ich glaube das ist wieder irre kompliziert geschrieben :P

    Mein Code-Ansatz kann natürlich auch völlig flasch sein, bin da für jede Hilfe dankbar !!!

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

    thelightsense schrieb:

    kompliziert geschrieben
    Nö, einfach nicht eindeutig. Zuerst soll also Schoko, dann weiß, dann grün kommen. Soweit klar. Das geht, indem Du den Zykluscode aus Post#2 nimmst und dann einfach die ColorList mit den Farben Schoko, Schwarz (oder Weiß?) und Grün festlegst. Aber was soll dann kommen? Und danach? Wenn es immer Schoko -> Schwarz/Weiß -> Grün -> Schwarz/Weiß -> Schoko -> Schwarz/Weiß -> Grün -> Schwarz/Weiß -> Schoko werden soll: na, dann hau eben noch ne Farbe in die Liste:

    VB.NET-Quellcode

    1. ColorList.AddRange({drawingcolor.Chocolate, drawingcolor.Black, drawingcolor.Green, drawingcolor.Black})
    und ändere bei Post#2, Zeile#7 auf ... Mod 4. Oder allgemein gleich auf

    VB.NET-Quellcode

    1. IndexOfColorToUse = (IndexOfColorToUse + 1) Mod ColorList.Count


    btw: "Jetzt kommt der Haken." - und kein Gartengerät
    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.
    Auch nicht 8o

    es reichen sogar zwei Farben ... (von oben nach unten) alle Bestellungen mit der gleichen Bestellnummer haben Schoko, wenn
    dann eine NEUE BESTELLNUMMER kommt mit sagen wir 3 Artikeln sollen alle drei Bestellnummern grün sein ...
    kommt die nächste Bestellnummer mit 2 Artikeln kann gerne wieder beide Bestellnummern Schoko sein ...

    (Tabelle 3 aus Post 1 - erst Schoko (1-3) ...weiß (4) ... grün (5-6) ... jetzt gerne wieder die nächsten gleichen
    Bestellnummern in Farbe schoko)
    Was funktioniert dann also nicht, wenn Du in die ColorList eben nur 2 Farben drin hast, nämlich Schoko und Grün? Was kommt dabei raus?
    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.
    Zeig mal bitte den relevanten Code. Denn das kann nicht sein, wenn die Bestellungen wirklich als gleich und unterschiedlich werden, Du nur 2 Farben in der ColorList hast und Du immer dann kolorierst, wenn sich Unterschiede auftun.
    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.

    VB.NET-Quellcode

    1. Dim ColorList As New List(Of Drawing.Color)
    2. Dim IndexOfColorToUse As Integer = 0
    3. Sub findediemehrfachenbestellungen()
    4. Dim i As Integer
    5. Dim DRV As DataRowView
    6. Dim DRVnext As DataRowView
    7. Dim drawingcolor As Color
    8. ColorList.AddRange({drawingcolor.Chocolate, drawingcolor.green})
    9. For i = 0 To Abfrage1BindingSource.Count - 2
    10. DRV = Abfrage1BindingSource(i)
    11. DRVnext = Abfrage1BindingSource(i + 1)
    12. If DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then
    13. IndexOfColorToUse = (IndexOfColorToUse + 1) Mod ColorList.Count
    14. Abfrage1DataGridView.Rows(i).Cells(1).Style.BackColor = ColorList(IndexOfColorToUse)
    15. End If
    16. Next
    17. End Sub


    p.s Danke schonmal für die Mühe
    Zeile#21 gehört raus aus dem If-Block, sonst gibt's ungefärbte Rows.
    Zeile#18 stimmt logisch nicht: Nur wenn es NICHT gleich ist, soll die Farbe geändert werden.
    Der ganze Code "übersieht" allerdings die letzte Zeile, da die nicht mit ihrer Folgezeile verglichen werden kann, da es keine gibt.
    Gegenvorschlag:

    VB.NET-Quellcode

    1. Dim ColorList As New List(Of Drawing.Color)
    2. Dim IndexOfColorToUse As Integer = 0
    3. Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ColorList.AddRange({Drawing.Color.Chocolate, Drawing.Color.Green})
    5. End Sub
    6. Private Sub findediemehrfachenbestellungen()
    7. Dim DRV As Data.DataRowView
    8. Dim DRVnext As Data.DataRowView
    9. For i = 0 To CompaniesBindingSource.Count - 1
    10. CompaniesDataGridView.Rows(i).Cells(1).Style.BackColor = ColorList(IndexOfColorToUse)
    11. If String.IsNullOrEmpty(CompaniesDataGridView.Rows(i).Cells(0).Value.ToString) OrElse i = CompaniesBindingSource.Count - 1 Then Continue For
    12. DRV = CompaniesBindingSource(i)
    13. DRVnext = CompaniesBindingSource(i + 1)
    14. If Not DRV.Item("Bestellung").Equals(DRVnext("Bestellung")) Then IndexOfColorToUse = (IndexOfColorToUse + 1) Mod ColorList.Count
    15. Next
    16. End Sub
    ...auch wenn ich den untypisierten Kram (Suche mit einem String) am Ende überhaupt nicht gern bei mir verwende.
    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.