DataGridView, Frage zur Darstellung von Bitmaps

22/12/2009 - 18:07 von Manfred Z. | Report spam
Hallo Leute,

ich habe eine Datatable, in der eine Spalte den Datentyp Object hat, und in
der Bitmaps gespeichert werden.

Ich erstelle ein DataView und weise dem DataGrid dieses als DataSource zu.
Die Tabelle wird dann selbststàndig ins Grid geladen.
Jedoch werden Datenspalten vom Typ Object als Text interpretiert.

Leider làsst sich anscheinend nachtràglich nicht der Spaltentyp im Grid auf
DataGridViewImageColumn umstellen oder die Spalte entsprechend konvertieren,
damit die Bitmaps dargestellt werden.

Deswegen benutze ich das Sortierereignis, um den Cell Datentyp jedesmal
entsprechend zu àndern.
Das ist natürlich nicht befriedigend.

Ich kann das Grid auch selber mit Spalten und Zeilen füllen, aber dann ist
es ja nicht an das DataView gebunden.

Hat jemand eine Tip, wie man as besser machen kann?

Grüße

Manfred
 

Lesen sie die antworten

#1 Peter Götz
23/12/2009 - 09:19 | Warnen spam
Hallo Manfred,

habe eine Datatable, in der eine Spalte den Datentyp Object hat,
und in der Bitmaps gespeichert werden.



Und warum wàhlst Du nicht Bitmap als Datentyp für
diese Spalte?


Ich erstelle ein DataView und weise dem DataGrid



DataGrid oder DataGridView?

dieses als DataSource zu.
Die Tabelle wird dann selbststàndig ins Grid geladen.
Jedoch werden Datenspalten vom Typ Object als Text
interpretiert.

Leider làsst sich anscheinend nachtràglich nicht der
Spaltentyp im Grid auf DataGridViewImageColumn
umstellen oder die Spalte entsprechend konvertieren,
damit die Bitmaps dargestellt werden.



s.oben:
erstelle die betr. Spalte Deiner DataTable gleich als
Spalte vom Typ Bitmap, dann erkennt das Grid um
was für einen Datentyp es sich handelt und erzeugt
dazu den passenden Spaltentyp (ImageColumn).


Deswegen benutze ich das Sortierereignis, um den
Cell Datentyp jedesmal entsprechend zu àndern.
Das ist natürlich nicht befriedigend.



Nicht nur "nicht befriedigend"


Ich kann das Grid auch selber mit Spalten und Zeilen füllen,
aber dann ist es ja nicht an das DataView gebunden.

Hat jemand eine Tip, wie man as besser machen kann?



Hier mal ein Beispiel:

' /// Code in einem leeren Formmodul (Form1.vb)
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private mDV As DataView

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

CreateControls()

CreateData()
With DGV
.DataSource = mDV
.Columns(0).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight

.Columns(2).DefaultCellStyle.Padding = _
New Padding(5)

.AutoResizeRows()
.AutoResizeColumns()
End With

End Sub

Private Sub CreateControls()
DGV = New DataGridView
With DGV
.Dock = DockStyle.Fill
.DefaultCellStyle.Font = _
New Font("Arial", 12)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

End With
Me.Controls.Add(DGV)
End Sub

Private Sub CreateData()
' ***** Pfad zur Datei anpassen *****
Dim FileName As String = _
"H:\Verzeicnis\DeinBild.bmp"

Dim i As Integer
Dim DR As DataRow
Dim BM As Bitmap

BM = DirectCast(Bitmap.FromFile(FileName), Bitmap)

mDT = New DataTable("mDT")
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", GetType(String))
.Columns.Add("Bild", GetType(Bitmap))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)
DR.Item(2) = BM

.Rows.Add(DR)
Next
End With

mDV = New DataView(mDT)
End Sub
End Class
' \\\ E N T E


Alternativ könntest Du auch gleich mit Image anstatt mit
Bitmap arbeiten. Die Sub CreateData() würde dann so
aussehen:

Private Sub CreateData()
' ***** Pfad zur Datei anpassen *****
Dim FileName As String = _
"H:\Verzeicnis\DeinBild.bmp"

Dim i As Integer
Dim DR As DataRow
Dim IMG As Imgage

IMG= Image.FromFile(FileName)

mDT = New DataTable("mDT")
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", GetType(String))
.Columns.Add("Bild", GetType(Image))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)
DR.Item(2) = IMG

.Rows.Add(DR)
Next
End With

mDV = New DataView(mDT)
End Sub

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen