Bild im Datagridview Animieren (C#->VB)

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    Bild im Datagridview Animieren (C#->VB)

    Guten Tag,

    ich hampel hier jetzt seit ein "paar" Minuten mit folgendem Sample(siehe Dateianhang) hin und her, bekomme es aber leider bei VB nicht zum laufen..

    Kann jemand helfen?

    Habs auch schon versucht es mithilfe eines Code-Converters zu übersetzen aber da ich nicht gerade der C# Profi bin, ist das ein wenig... Naja sagen wir doof.


    Im aktuellen VB Projekt habe ich halt ein Datagridview, welches an eine Bindinglist gebunden ist, diese Bindinglist bzw. dessen einzelnen "Member" haben ein Bild (Image) als Property.
    Die normalen Bilder klappen ohne Probleme..

    Ich habe der Property dann halt das Gif Bild zugewiesen und Invalidate die (getestet) korrekte Zelle mithilfe eines Timers. Trotzdem tut sich nichts :/!
    Dateien
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Krass, bei mir hat so gut wie alles geflackert :/..

    Kannst du mir das Snippet vlt. geben?

    Wäre dir sehr dankbar.. Nachdem ich mich dann länger damit rumgeschlagen hatte, habe ich dann irgendwann aufgegeben und dann nur n statisches Bild genommen.

    Sonst setz ich mich "morgen" nochmal ran.

    Naja so oder so, danke.

    PS: Habs noch zusammengefummelt bekommen, aber irgendwie flackert das bei mir trotzdem.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Form1
    3. Dim Sätze As New BindingList(Of Satz)
    4. Dim img As Image = My.Resources.ajax_loader
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. dg.DataSource = Sätze
    7. AddHandler dg.CellPainting, AddressOf dg_CellPainting
    8. ImageAnimator.Animate(img, New EventHandler(AddressOf OnFrameChanged))
    9. End Sub
    10. Private Sub OnFrameChanged(ByVal sender As Object, ByVal e As EventArgs)
    11. dg.Invalidate()
    12. End Sub
    13. Private Sub dg_CellPainting(ByVal sender As Object, ByVal e As DataGridViewCellPaintingEventArgs)
    14. If e.RowIndex >= 0 AndAlso e.ColumnIndex = 1 Then
    15. e.Paint(e.CellBounds, DataGridViewPaintParts.Background)
    16. ImageAnimator.UpdateFrames()
    17. e.Graphics.DrawImage(img, New Point(e.CellBounds.Location.X + e.CellBounds.Width / 2 - img.Size.Width / 2, e.CellBounds.Y + 3))
    18. e.Handled = True
    19. End If
    20. End Sub
    21. End Class
    22. Public Class Satz
    23. Public Property ID As Integer = 0
    24. Public Property Bild As Image = My.Resources.arrow_up
    25. End Class


    Ps: Nicht wundern wegen den vielen Edits, habe versucht das neue Quellcode Tag hinzubekommen..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von „Rootbob91“ ()

    Rootbob91 schrieb:

    PS: Habs noch zusammengefummelt bekommen, aber irgendwie flackert das bei mir trotzdem.

    Das DataGridView muss einen DoubleBuffer per Extension haben, dann hat sichs ausgeflackert (Übersetzen in Basic sollte kein Problem sein).

    C#-Quellcode

    1. public static class Extensions
    2. {
    3. public static void DoubleBuffered(this Control ctrl, bool setting)
    4. {
    5. Type trvType = ctrl.GetType();
    6. PropertyInfo pi = trvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
    7. pi.SetValue(ctrl, setting, null);
    8. }
    9. }

    Und - ganz wichtig - dem DataGridView das ganze Autoresizing abgewöhnen - das kostet Zeit, die sich gern in Flackern äußert.

    C#-Quellcode

    1. // DataGridView
    2. dgvAni.DoubleBuffered(true);
    3. dgvAni.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
    4. dgvAni.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
    5. dgvAni.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

    New Point(e.CellBounds.Location.X + e.CellBounds.Width / 2 - img.Size.Width / 2, e.CellBounds.Y + 3)

    Was machst Du denn hier Lustiges? :D

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „diylab“ ()

    New Point(e.CellBounds.Location.X + e.CellBounds.Width / 2 - img.Size.Width / 2, e.CellBounds.Y + 3)
    Was machst Du denn hier Lustiges? :D


    Damit sich das Icon mittig in die Zelle setzt mach ich das, jedenfalls so ein bisschen, war erstmal Spielerei, weil das Icon/Bild sonst immer total komisch positioniert wurde.

    Also ich hab das jetzt soweit hinbekommen, die Extensions sowie die anderen Tricksereien habens schonmal gebracht, ich teste das gleich nochmal im Hauptprojekt dann sehen wir weiter :)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

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

    Nice, ich wusste auch, dass das irgendwie per Eigenschaft geht, jetzt hab ich se gefunden^^..

    Jetzt setze ich allerdings das MiddleCenter Alignment an den wichtigsten stellen des Codes von meinem Hauptprojekt, allerdings wird das Bild oben links animiert :/..

    Ich dachte mir: "Gut, vll werden die Eigenschaften resetted wenn das DGV ne neue Datasource bekommt" - Also hab ich die Eigenschaft an den Stellen immer neu gesetzt, allerdings wird es trotzdem oben links animiert :/!

    Wie kann das?

    Ps: hab auch gerade noch im CellPainting Event überprüft.. Dort steht das Alignment der Zelle auch noch auf MiddleCenter, aber warum wird dann nicht mittig gezeichnet?
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

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

    Ahhh okay!

    Wobei das dann n lustiger Zufall war, dass bei meinem ersten Versuch die Bilder genau gepasst haben und mittig waren xD!

    Naja ich danke dir mega, habs dann jetzt alles hinbekommen ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..