重写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
本文介绍如何在VB.NET中使用DataGrid显示图片,并通过重写DataGridTextBoxColumn类实现自定义绘制选项。提供了完整的代码示例,包括创建数据表、加载图片资源、设置DataGrid样式等步骤。

2741

被折叠的 条评论
为什么被折叠?



