重写DataGridTextBoxColumn类
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Data
Imports System.Collections
' / <summary>
' / Summary description for DataGridImageCell.
' / </summary>
Public Class DataGridImageCell
Inherits DataGridTextBoxColumn
Private theImages1 As ArrayList
Public Sub New()
End Sub 'New
Public Property theImages() As ArrayList
Get
Return theImages1
End Get
Set
theImages1 = value
End Set
End Property
Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
Dim o As Object = Me.GetColumnValueAtRow([source], rowNum)
If Not (o Is Nothing) Then
Dim i As Integer = Fix(o)
g.FillRectangle(backBrush, bounds)
Dim bmp As Bitmap = CType(theImages(i), Bitmap)
'GridImageCellDrawOption cellDrawOption = GridImageCellDrawOption.NoResize;
'GridImageCellDrawOption cellDrawOption = GridImageCellDrawOption.FitProportionally;
Dim cellDrawOption As GridImageCellDrawOption = GridImageCellDrawOption.FitToCell
Dim gu As System.Drawing.GraphicsUnit = System.Drawing.GraphicsUnit.Point
Dim srcRect As RectangleF = bmp.GetBounds(gu)
Dim destRect As Rectangle = Rectangle.Empty
Dim saveRegion As [Region] = g.Clip
Select Case cellDrawOption
Case GridImageCellDrawOption.FitToCell
destRect = bounds
Case GridImageCellDrawOption.NoResize
destRect = New Rectangle(bounds.X, bounds.Y, Fix(srcRect.Width), Fix(srcRect.Height))
g.Clip = New [Region](bounds)
Case GridImageCellDrawOption.FitProportionally
If (True) Then
Dim srcRatio As Single = srcRect.Width / srcRect.Height
Dim tarRatio As Single = System.Convert.ToSingle(bounds.Width) / bounds.Height
destRect = bounds
If tarRatio < srcRatio Then
destRect.Height = Fix(destRect.Width * srcRatio)
Else
destRect.Width = Fix(destRect.Height * srcRatio)
End If
End If
Case Else
End Select
If Not destRect.IsEmpty Then
'g.DrawImage(bmp, destRect, srcRect, gu)
Dim destRectF As New RectangleF(destRect.X, destRect.Y, destRect.Width, destRect.Height)
Dim srcRectF As New RectangleF(srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height)
g.DrawImage(bmp, destRectF, srcRectF, gu)
End If
g.Clip = saveRegion
End If
End Sub 'Paint
Protected Overloads Overrides Sub Edit(ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
'overriden to avoid editing
End Sub 'Edit
Public Enum GridImageCellDrawOption
FitToCell = 0
NoResize = 1
FitProportionally = 2
End Enum 'GridImageCellDrawOption
End Class ' DataGridImageCell
测试代码
Private
WithEvents
dataGrid1
As
System.Windows.Forms.DataGrid
Private nRows As Integer = 5
Private bitMaps As ArrayList
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'create a datatable
Dim dt As New DataTable("MyTable")
dt.Columns.Add(New DataColumn("Col0"))
dt.Columns.Add(New DataColumn("Images", GetType(Integer)))
Dim r As New Random()
Dim i As Integer
For i = 0 To nRows - 1
Dim dr As DataRow = dt.NewRow()
dr(0) = String.Format("row{0}", i)
dr(1) = r.Next(4)
dt.Rows.Add(dr)
Next
'store bitmaps in an arraylist
bitMaps = New ArrayList()
Dim strm As System.IO.Stream = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Blue hills.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Sunset.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Water lilies.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Winter.jpg")
bitMaps.Add(New Bitmap(strm))
Dim tableStyle As New DataGridTableStyle()
tableStyle.MappingName = "MyTable"
Dim tbc As New DataGridTextBoxColumn()
tbc.MappingName = "Col0"
tbc.HeaderText = "Column 1"
tbc.Width = 50
tableStyle.GridColumnStyles.Add(tbc)
Dim width As Integer = Me.dataGrid1.ClientSize.Width - tbc.Width - Me.dataGrid1.RowHeaderWidth - 4
Dim tbc1 As New DataGridImageCell()
tbc1.MappingName = "Images"
tbc1.HeaderText = "Images"
tbc1.theImages = bitMaps
tbc1.Width = width
tableStyle.GridColumnStyles.Add(tbc1)
Me.dataGrid1.TableStyles.Add(tableStyle)
Me.dataGrid1.DataSource = dt
dt.DefaultView.AllowNew = False
Dim rect As Rectangle = Me.dataGrid1.GetCellBounds(0, 0)
topPos = rect.Top
Dim height As Integer = (Me.dataGrid1.ClientSize.Height - topPos - nRows) / nRows
tableStyle.PreferredRowHeight = height
Me.dataGrid1.DataSource = Nothing
Me.dataGrid1.DataSource = dt
End Sub ' Form1_Load
Private nRows As Integer = 5
Private bitMaps As ArrayList
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'create a datatable
Dim dt As New DataTable("MyTable")
dt.Columns.Add(New DataColumn("Col0"))
dt.Columns.Add(New DataColumn("Images", GetType(Integer)))
Dim r As New Random()
Dim i As Integer
For i = 0 To nRows - 1
Dim dr As DataRow = dt.NewRow()
dr(0) = String.Format("row{0}", i)
dr(1) = r.Next(4)
dt.Rows.Add(dr)
Next
'store bitmaps in an arraylist
bitMaps = New ArrayList()
Dim strm As System.IO.Stream = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Blue hills.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Sunset.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Water lilies.jpg")
bitMaps.Add(New Bitmap(strm))
strm = [GetType]().Assembly.GetManifestResourceStream("ImageCellInDataGrid.Winter.jpg")
bitMaps.Add(New Bitmap(strm))
Dim tableStyle As New DataGridTableStyle()
tableStyle.MappingName = "MyTable"
Dim tbc As New DataGridTextBoxColumn()
tbc.MappingName = "Col0"
tbc.HeaderText = "Column 1"
tbc.Width = 50
tableStyle.GridColumnStyles.Add(tbc)
Dim width As Integer = Me.dataGrid1.ClientSize.Width - tbc.Width - Me.dataGrid1.RowHeaderWidth - 4
Dim tbc1 As New DataGridImageCell()
tbc1.MappingName = "Images"
tbc1.HeaderText = "Images"
tbc1.theImages = bitMaps
tbc1.Width = width
tableStyle.GridColumnStyles.Add(tbc1)
Me.dataGrid1.TableStyles.Add(tableStyle)
Me.dataGrid1.DataSource = dt
dt.DefaultView.AllowNew = False
Dim rect As Rectangle = Me.dataGrid1.GetCellBounds(0, 0)
topPos = rect.Top
Dim height As Integer = (Me.dataGrid1.ClientSize.Height - topPos - nRows) / nRows
tableStyle.PreferredRowHeight = height
Me.dataGrid1.DataSource = Nothing
Me.dataGrid1.DataSource = dt
End Sub ' Form1_Load