在DataGrid中添加图片列(VB.NET) 重写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 Class DataGridImageCell Inherits DataGridTextBoxColumn Private theImages1 As ArrayList Public Sub New()Sub New() End Sub 'New Public Property theImages()Property theImages() As ArrayList Get Return theImages1 End Get Set theImages1 = value End Set End Property Protected Overloads Overrides Sub Paint()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()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 GridImageCellDrawOptionEnum GridImageCellDrawOption FitToCell = 0 NoResize = 1 FitProportionally = 2 End Enum 'GridImageCellDrawOptionEnd Class ' DataGridImageCell 测试代码 Private WithEvents dataGrid1 As System.Windows.Forms.DataGrid Private nRows As Integer = 5 Private bitMaps As ArrayList Private Sub Form1_Load() 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