Icons im DatagridView und das CellFormatting-Event

    • VB.NET

      Icons im DatagridView und das CellFormatting-Event

      Bilder inne Datenbank sind ja üblicherweise nicht ganz so dolle, weil bei 1000 Datensätzen, mit je einem Bild von kleinen 500KB - also da muß man eine Optimierung des Platzverbrauchs doch mal ins Auge fassen, ums nett zu sagen ;)

      Anners isses mit Icons. Icons sind zum einen nicht so fett wie Bilder, aber v.a. sind sie wiederverwendbar. Also es ist kein Problem 1000 Datensätze mit Icons auszustatten, denn es sind immer dieselben Icons, die in den Datensätzen angezeigt werden.


      Und es gibt ja auch eine extra DataGridViewImageColumn für Bilderle. Aber das ist doch problematisch, denn die ImageColumn holt sich ihr Bildle normalerweise aussm Datensatz, und bei 1000 Datensätzen - so viele Icons hamwanich und wollemer auch nicht 8|;

      Und da kommt jetzt das CellFormatting-Event ins Spiel: Also im Dataset hinterlegen wir für die IconColumn keine Bitmap, sondern nur einen Integer-Index, den ImageIndex. Und im Formatting-Event tauschen wir diesen Integer aus gegen ein richtiges Image, was die DataGridViewImageColumn auch anzeigen kann.

      Man sieht, dass hier ein erweiteres Verständnis von "Formatierung" zugrundeliegt. Also Formatierung ist nicht allein auf Daten beschränkt, die man als sinnvoll lesbare Strings darstellen will (etwa Datumse, oder Währungswerte), sondern Formatierung ist einfach die Umwandlung von Daten für die Anzeige, und wenn die Anzeige eine Bitmap erfordert, dann bedeutet Formatierung des ImageIndex halt die Umwandlung eines Integers in eine Bitmap.
      Dass man ihn anzeigen kann.

      Also Code

      VB.NET-Quellcode

      1. Private _Images As Bitmap()
      2. Public Sub New()
      3. InitializeComponent()
      4. _Images = ImageList1.Images.Cast(Of Bitmap).ToArray
      5. End Sub
      6. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
      7. If e.ColumnIndex <> 0 Then Return
      8. e.Value = _Images(CInt(e.Value))
      9. e.FormattingApplied = True
      10. End Sub
      Zeile #5: Zur Vorbereitung wird nach InitializeComponent() die Imagelist (da habich meine Bildle reingemacht) in ein Bitmap-Array kopiert, weil Array gewährt den allerschnellsten Zugriff.
      Zeile #10: Naja, und die "Umwandlung" des Values in eine Bitmap könnte kaum einfacher sein, odr? Sie wird (hier) einfach aus dem _Images-Array geholt.
      8-)


      Dateien

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