Endlos - Tabelle mit Background-Image; Flowlayoutpanel flackert beim scrollen

  • VB.NET
  • .NET 7–8

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Endlos - Tabelle mit Background-Image; Flowlayoutpanel flackert beim scrollen

    Hallo,
    ich möchte eine Tabellenansicht, mit Hintergrundbild: Die erste Zeile ist dunkelgrün die Zweite hellgrün, dann immer abwechselnd, wenn eine neue Zeile dazu kommt.
    Ich habe das mit einem flowlayoutpanel gelöst. Aber wenn ich scrolle dann verschwimmt auch der Hintergrund und wird am Ende des Scrollens nicht mehr richtig angezeigt.
    Ich habe dann im Scroll-Event des flowlayoutpanel visible = false und dann auf true gesetzt, dann wird die Tabelle am ende des Scrollens sauber angezeigt, aber während des Scrollens, flackert es.
    Kann ich das irgendwie beheben. Gibt es beispielsweise ein Event, dass erst getriggert wird, wenn ich mit dem Scrollen fertig bin?

    Ausserdem, hätte ich gerne, dass der Hintergrund mit scrollt: So wie es jetzt ist, kann ich zum Beispiel so scrollen, dass eine Zeile zwischen hell und dunkelgrün stehen bleibt...

    Oder hab ich evtl. das falsche Control ausgesucht?

    Ich füge mal das Programm an, dann kann man besser sehen was passiert.

    ausführbare Anhänge sind außerhalb des Showrooms nicht erlaubt und wurden entfernt ~VaporiZed

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

    Humax schrieb:

    Gibt es beispielsweise ein Event, dass erst getriggert wird, wenn ich mit dem Scrollen fertig bin?
    Ich denke nicht, denn was bedeutet es mit Scrollen fertig zu sein?
    Du kannst es dir selbst basteln. Du erstellst einen OneShot-Timer, den resettest du im Scroll-Event immer. Wenn das Scroll-Event lange genug nicht aktiv ist, dann feuert das Timer-Tick Event letzten Endes. Und darin kannst du deinen Code packen der eigentlich ablaufen soll.

    Humax schrieb:

    Oder hab ich evtl. das falsche Control ausgesucht?
    Vielleicht. Um eine Tabelle anzuzeigen, kannst du doch ein DataGridView verwenden.
    Bitte ggf. Projekt als solches anhängen, keine Exe-Dateien.

    Da ein DGV von Haus aus kein Hintergrundbild hat, müsstest Du da selbst tätig werden, also tiefer drin rumbasteln. Aber kannst Du mal mit Bildern zeigen, wie das gewünschte Endergebnis in verschiedenen Phasen sein soll? Bedenke auch, dass ein geankertes/gedocktes FlowLayoutPanel bei Größenänderungen seine Child-Controls neu verteilt.
    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.
    Den gewünschten Effekt kannst Du vorerst erreichen, indem Du am Ende des FlowLayoutPanel1.Scroll-EventHandlers ergänzt: FlowLayoutPanel1.Invalidate()

    Das Scroll-Event wird durch das Klicken in der Scrollbar ausgelöst, aber nicht durch Verwendung des Mausrads! Du hättest also jetzt noch nicht alle relevanten Fälle abgedeckt.
    Es stellt sich auch die Frage, ob es gewünscht ist, dass die Labels zwischen den grünen Zeilen schweben sollen:
    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.
    Mein Programm hat einige Tabellen. Die Tabellen hierzu (mir Rahmenlinien etc.) habe ich gezeichnet. Sieht alles so aus wie ich will.
    Aber eine Tabelle hat halt nicht wie alle anderen Tabellen eine vorgegebene bzw. maximale Anzahl an Zeilen. Deshalb brauche ich für diese letzte Tabelle eine andere Möglichkeit.
    Überlegt hatte ich mir auch die Möglichkeit ich mache einfach eine "Feste" Tabelle mit 10 Zeilen, wenn mehr Zeilen benötigt würden, schalte ich einfach per Button Klick auf die nächste / vorherige Seit um. Das wäre ok, ist aber natürlich nicht so schick, als wenn man scrollen könnte.
    Hier mal ein Video zu dem Programm in dem ich die Tabelle brauche:
    file-upload.net/download-15307…24-04-1611-17-00.mp4.html

    Am Ende des Videos ist die Letzte Form, die ich gerade erstelle. Dort unter Statistiken soll dann quasi die unendliche Tabelle hin

    @VaporiZed
    Eigentlich sollte der Hintergrund mit scrollen, also das die jeweiligen Zeilen auch in der hell oder dunkelgrünen Zone bleiben.



    --EDIT--
    @VaporiZed
    Ja mit .invalidate() sieht das gut aus. Danke.
    Gibts jetzt noch die Möglichkeit, den Hintergrund mit zu scrollen?

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

    Was meinst du denn mit endlos überhaupt? Du schreibst die anderen Tabellen haben eine feste Anzahl an Zeilen. Ich denke dann meinst du statt endlos dynamische Zeilenanzahl?

    Hier dein Gebilde als DGV, mit Scrollbar und veränderlichen Zellen, alles was ne Tabelle so tut. Hinzufügen von Zeilen, kann man aus und einschalten. Ist also womöglich auch was für deine festen Tabellen.

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

    File-Upload.net? Das will, dass ich meinen Adblocker deaktiviere und was danach kommt, gefällt mir nicht.
    Du kannst Dein Video auch zippen und hier forenintern hochladen.

    Was kann das von @Haudruferzappeltnoch gezeigte DGV nicht, was Du gern hättest? Das DGV ist für Tabellen von Haus aus das beste Control.
    In welcher Größenordnung bewegt sich die Anzahl der Zeilen - in realen Szenarien? 100? 1000? 1 Million?
    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.
    Ich füge mal Bilder meiner Bisherigen Tabellen (Hintergründe) an. So soll es aussehen. Mit den "normalen" Tabellen passt das ja. Einfach als Hintergrundbild setzen und gut ist.
    Bei der Tabelle die jetzt noch fehlt (mit dynamischer Zeilenanzahl), soll es genauso aussehen. Also die jeweiligen Spalten / Zeilen schon eingerahmt. Und die grünen Flächen sind nicht einfach nur hell-/ dunkel grün sondern auch verrauscht.
    Die dynamische Tabelle beginnt mit 0 Zeilen, ist also erst mal leer. Mit jedem (Spiel)-Jahr wird es eine Zeile mehr.

    Das mit dem Video hab ich gesehen, klappt eh nicht, der hat das Programm gar nicht mit aufgezeichnet.
    Bilder
    • KreuzTabelle_1855x1005_gezeichnet_rauschen27.png

      5,17 MB, 1.855×1.005, 273 mal angesehen
    • Tabelle_1175x1005_rauschen27_gezeichnet_neu.png

      3,15 MB, 1.175×1.005, 290 mal angesehen
    Guck mal, ob das bei dir performt, da kannste sogar Spalten nach belieben auslassen oder andere Farben vergeben:

    VB.NET-Quellcode

    1. Private _NoBackPaintParts As DataGridViewPaintParts = DataGridViewPaintParts.All Xor DataGridViewPaintParts.Background
    2. Private _BackBrushDefault As New TextureBrush(New Bitmap(""))
    3. Private _BackBrushAlternate As New TextureBrush(New Bitmap(""))
    4. Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
    5. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return
    6. If e.ColumnIndex < 0 OrElse e.RowIndex < 0 Then Return
    7. e.Graphics.FillRectangle(If(e.RowIndex Mod 2 = 0, _BackBrushDefault, _BackBrushAlternate), e.CellBounds)
    8. e.Paint(e.CellBounds, _NoBackPaintParts)
    9. e.Handled = True
    10. End Sub
    guck dazu auch das Tutorial.

    Wenn man keinen Brush bräuchte, sondern ein Color definieren kann, geht es sicher noch deutlich besser. Mit den Rändern muss man sicher auch noch was basteln.


    Außerdem: Hast du das Timer Konzept aus Post 2 mal getestet, wenn du bei einem LayoutPanel mit Hintergrundbild bleiben willst.

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

    Haudruferzappeltnoch schrieb:

    Außerdem: Hast du das Timer Konzept aus Post 2 mal getestet, wenn du bei einem LayoutPanel mit Hintergrundbild bleiben willst.


    Hab ich jetzt nicht probiert, da das flackern schon mit .invalidate() gelöst wurde.
    Habe mir das GDV nochmal genauer angeguckt. Es kommt meinen Vorstellungen dann doch schon relativ nahe. Ich hätte zwar die CellBorderStyle gerne noch etwas dicker, aber der Vorteil des GDV beim Scrollen überwiegt das kleine optische "Manko".
    Ich werde jetzt mal die Variante mit dem DGV und dem FlowLayoutPanel vergleichen und dann entscheiden, für welche Variante ich mich entscheide.
    Danke erstmal

    Humax schrieb:

    Ich hätte zwar die CellBorderStyle gerne noch etwas dicker
    Kannst an sich alles an der Zelle selbst zeichnen. Nur je mehr du zeichnest desto mehr musst du beachten. Zum Beispiel ändert sich die Border beim Selektieren normalerweise nicht im Gegensatz zum Background, ist aber auch Geschmackssache

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

    Könnte mir jemand erklären, was die folgende Zeile aus #13 macht?

    Quellcode

    1. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return


    Wenn ich die Zeile drin lasse, dann wird das Sub (wenn eine Zelle der Datagridview in der 1. Zeile gezeichnet wird) verlassen.
    Damit also alles Zellen entsprechend gezeichnet wird, muss ich die Zeile auskommentieren. Aber irgendeinen Sinn hat die Zeile doch bestimmt.
    Ich verstehe leider nur soviel, dass das Sub verlassen wird wenn die Bedingungen dazu erfüllt sind. Aber ich verstehe die Bedingungen nicht !?
    @Humax Fang mal an und mach Option Strict On.
    Visual Studio – Empfohlene Einstellungen
    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!

    Humax schrieb:

    VB.NET-Quellcode

    1. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return
    Aber ich verstehe die Bedingungen nicht !?
    Was da passiert, ist eiglich sonnenklar: Die Sub wird nur dann nicht verlassen, wenn die zu zeichnende Zelle selectiert ist.

    Um das wirklich zu verstehen, musst du aber programmieren lernen.
    Weil die wirkliche Erklärung lautet
    DataGridViewElementStates ist ein Enum, und And ist eine bitweise Operation, die in diesem Fall nur dann <>0 ergibt, wenn im Wert von e.State das "Selected"-Bit gesetzt ist.

    Also das Verständnis dieser beiden Fachbegriffe: Enum, bitweise Operation musst du dir erarbeiten, dann verstehst du die Zeile selber.
    Möglicherweise musst du auch noch überhaupt erlernen, was ein Datentyp ist (strict on wird dir dabei helfen).
    Also ich empfehle dir sehr, was ich hier quasi als Lehrplan aufgestellt hab. Du musstes nicht bis Ende durcharbeiten, aber Datentyp, Enum, bitweise Operation - das sind Grundlagen, die man sich am besten aus einem guten Buch aneignet.

    Ohne das wirst du immer wieder dumm dastehen, und andere Leute fragen müssen, was das bedeutet, was du selbst programmiert hast.

    RodFromGermany schrieb:

    @Humax Fang mal an und mach Option Strict On.
    Visual Studio – Empfohlene Einstellungen



    Option Strict steht auf on.
    Den Code verstehe ich ja nicht, weil ich ihn nicht selbst geschrieben und ihn nur zu meinem Programm hinzugefügt habe.

    Was da passiert, ist eiglich sonnenklar: Die Sub wird nur dann nicht verlassen, wenn die zu zeichnende Zelle selectiert ist.

    Danke für die Erklärung, dann kann ich es in meinem Fall weg lassen

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