Laden...

Images in Dataset und DatagridView

Erstellt von ErfinderDesRades vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.310 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 13 Jahren
Images in Dataset und DatagridView

Ein typisiertes Dataset kann auch Images speichern, allerdings nicht als Bitmap, sondern als Blob (Byte-Array).
Dazu passend kann dem DGV eine ImageColumn zugefügt werden, die solche Blobs als Image anzeigt.
Auch sind diese Blobs problemlos an die BackGroundImage-Property von Controls bindebar (ist im Beispiel im FormDesigner ausgeführt).

Häufiger will man aber weniger massenhaft Bilder in seinem Dataset haben, sondern einen begrenzten Satz, der dann als Icons fungiert, auf die von versch. Stellen verwiesen wird.
Leider kann die ImageColumn nicht verweisen, daher muß man entweder die Zelle selbst zeichnen, oder die Verweiserei im .CellFormatting-Event selbst implementieren.


      private void grdRelated_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
         var grd = (DataGridView)sender;
         if(e.ColumnIndex != 1 || e.RowIndex < 0 || e.RowIndex > grd.RowCount - 2) return;
         var drv = (DataRowView)grd.Rows[e.RowIndex].DataBoundItem;
         var rw = (MenuDts.RelatedDataRow)drv.Row;
         if(rw.RowState == DataRowState.Detached) return;
         /*e.FormattingApplied = true;
          * Da rw.MenuRow.Img kein Image ist, sondern ein Blob, darf e.FormattingApplied nicht gesetzt werden, denn das Standard-Formatting muß den Blob noch umarbeiten.
          */
         e.Value = rw.MenuRow.Img;  //der formatierte Wert verweist nun auf das Image der übergeordneten MenuRow
      }

Müsste man erst noch testen, ob diese Vorgehensweise wesentlich unperformanter ist, als im .CellPainting das Image selbst zu zeichnen. In Vergleich DatagridView - ListView wird letzterer Weg eingeschlagen, und zwar sehr optimiert, denn die dortigen Bitmaps haben nur Größe 16*16, und werden mit e.Graphics.DrawImageUnscaled() gezeichnet.
Dataset, Image, Bitmap, DatagridView, DatagridViewImageColumn

Der frühe Apfel fängt den Wurm.