bestimmte Zeile eines DataGridView-Icon ändern

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Gregor Jasinski.

    bestimmte Zeile eines DataGridView-Icon ändern

    Hallo!
    Ich verwende folgenden Code um ein Icon in jeder Zeile eines Datagrid zu verwenden:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs, Optional zeile As Integer = -1) Handles DataGridView1.RowPostPaint
    3. Dim i As Integer
    4. While i < DataGridView1.Rows.Count - 1
    5. Dim mybitmap As New Bitmap(ImageList1.Images(0))
    6. If e.RowIndex = zeile Then
    7. mybitmap = ImageList1.Images(0)
    8. Else
    9. mybitmap = ImageList1.Images(1)
    10. End If
    11. Dim myicon As Icon = Icon.FromHandle(mybitmap.GetHicon())
    12. Dim graphic As Graphics = e.Graphics
    13. Dim iconheight As Integer = 16
    14. Dim iconwidth As Integer = 16
    15. Dim xposition As Integer = e.RowBounds.X + (DataGridView1.RowHeadersWidth / 2)
    16. Dim yposition As Integer = e.RowBounds.Y + (DataGridView1.Rows(e.RowIndex).Height - iconheight)
    17. Dim rechtangle As New Rectangle(xposition, yposition, iconwidth, iconheight)
    18. graphic.DrawIcon(myicon, rechtangle)
    19. i = i + 1
    20. End While
    21. End Sub
    22. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    23. End Sub
    24. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    25. DataGridView1.Rows.Add(DataGridView1.Rows.Count.ToString)
    26. End Sub
    27. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    28. DataGridView1_RowPostPaint(sender, e, 1)
    29. End Sub
    30. End Class


    Das funktioniert auch soweit. Über Button1 füge ich eine weitere Zeile hinzu.

    Ich möchte nun über Button2 eine Bestimmte Zeile das Icon ändern. Dazu habe ich den Aufruf bei Button2 eingefügt. Leider bekomme ich da aber folgende Meldung (siehe Anhang)
    Weiß aber nicht ob dies der richtige Weg ist.
    Vielleicht kann mir jemand dabei behilflich sein.
    Danke

    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed
    Bilder
    • fehler.png

      48,45 kB, 1.329×488, 43 mal angesehen

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

    DataGridVIEW. Das DataGrid ist was völlig anderes.
    Statt einen EventHandler manuell aufzurufen, pack den Code aus Deiner DataGridView1_RowPostPaint-Methode in eine eigene, neue Methode mit gutem Namen. Dann siehst Du, welche Parameter diese Methode braucht, nämlich die Adresse der Zelle. Diese kannst Du auch z.B. per DataGridView1.CurrentCell bekommen. Und dann kannst Du damit innerhalb von Button2_Click Deine neue Methode aufrufen.

    btw: Eine sinnvolle Control-Benennung wäre nicht nur für uns hilfreich …
    Und verwende bitte nicht dauernd die allgemeinen Code-Tags. Es gibt die VB.NET-Tags. Ich hab das korrigiert … mal wieder.
    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.
    Danke für die Antwort und Sorry, dass ich wieder vergessen habe den Code mit den richtigen Codetag einzufügen.

    Das mit der eigenen Methode habe ich schon versucht. Ich benötige aber da

    VB.NET-Quellcode

    1. e As DataGridViewRowPostPaintEventArgs

    Leider weiß ich nicht wie ich dies in der neuen Methode verwenden kann.
    Danke

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

    dann geht das wohl nicht.
    so wie dein EventHandler geschrieben ist (post#1) benötigt er ein DataGridViewRowPostPaintEventArgs. Das gibts aber nur im RowPostPaint-Event, und nicht im ButtonClick-Event.
    Also schreib eine neue Methode, die tut, was zu tun ist, und die ohne DataGridViewRowPostPaintEventArgs auskommt.
    Es ist sowieso komisch, im EventHandler für das DataGridView1.RowPostPaint-Event alle Zeilen durchzugehen und diese zu ändern. Dieses Event wird gefeuert, wenn eine bestimmte Zeile gemalt wurde. Daher ist jener EventHandler für das zu erreichende Ziel eh nicht geeignet. Vielleicht dann doch klassisch der Paint-EventHandler des DGVs?
    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. Private Sub DataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs, Optional zeile As Integer = -1) Handles DataGridView1.RowPostPaint
    2. (...)
    3. End Sub
    4. (...)
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. DataGridView1_RowPostPaint(sender, e, 1)
    7. End Sub


    Man kann eine Eventroutine nicht einfach so wie in eine normale Sub betrachten und versuchen mit Gewalt dort einzuspringen - und dann das ganze auch noch aus einem anderen Event heraus (ButtonClick) und obendrein auch noch die EventArgumente dieser ClickEventRoutine versuchen der anderen EventRoutine unterzujubeln. Selbst wenn man das irgendwie casten könnte, die passenden Argumente gibt es zu diesem Zeitpunkt gar nicht - sie existieren einfach nicht, auch e.Graphics (oder den Verweis darauf) gibt es in diesem Moment nicht. Das einzige, was vielleicht gehen würde, wäre den ganzen PaintInhalt aus dem PaintEvent in eine separate Sub auszulagern, dieser Sub müsste man dann alle Parameter zum Zeichnen übergeben, vor allem den Verweis auf e.Graphics oder generell irgendeine Grafik, damit diese Routine weiß, worauf gezeichnet werden soll. Diese Routine zum Zeichnen könnte man dann problemlos aus einer anderen, beliebigen Stelle des Programms aufrufen, auch aus einem ButtonClickEvent heraus, allerdings müsste man auch wissen, worauf diese dann zeichnen soll - also einen Verweis auf irgendeine Grafik haben. Ich hatte so was Ähnliches schon mal gemacht, allerdings habe ich damals auf einer PictureBox gezeichnet, so dass ich immer auch eine Grafik als Verweis meiner Zeichnenroutine übergeben konnte - entweder hat dann die PaintRoutine beim automatischen Aufruf ihren Verweis auf e.Graphics der PictureBox dieser Routine übergeben oder ich meinen selbsterstellten Grafikverweis derselben PictureBox, wenn ich diese Zeichenroutine explizit zum Ändern der Zeichnung aufgerufen habe. Das alles richtig miteinander zu verbinden, damit es reibungslos und fehlerfrei funktioniert, ist nicht so trivial - ich kann mir nicht vorstellen, dass das jemand hier aus dem aktuellen und aktiven ForumUserPool auf die Beine stellen und erfolgreich zum Laufen bringen könnte, aber vielleicht täusche ich mich auch und es gibt tatsächlich einen, der es schaffen könnte.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Gregor Jasinski“ ()