向自定义datagridview列添加边距

时间:2012-06-25 13:52:20

标签: vb.net datagridview

我使用以下代码taken from here为datagridview创建自己的自定义列,以便我现在可以在同一个单元格中拥有图像和文本:

Public Class TextAndImageColumn
    Inherits DataGridViewTextBoxColumn
    Private imageValue As Image
    Private m_imageSize As Size
    Public Sub New()
        Me.CellTemplate = New TextAndImageCell
    End Sub
    Public Overloads Overrides Function Clone() As Object
        Dim c As TextAndImageColumn = TryCast(MyBase.Clone, TextAndImageColumn)
        c.imageValue = Me.imageValue
        c.m_imageSize = Me.m_imageSize
        Return c
    End Function
    Public Property Image() As Image
        Get
            Return Me.imageValue
        End Get
        Set(ByVal value As Image)
            Me.imageValue = value
            Me.m_imageSize = value.Size
            Dim inheritedPadding As Padding = Me.DefaultCellStyle.Padding
            Me.DefaultCellStyle.Padding = New Padding(ImageSize.Width, inheritedPadding.Top, inheritedPadding.Right, inheritedPadding.Bottom)
        End Set
    End Property
    Private ReadOnly Property TextAndImageCellTemplate() As TextAndImageCell
        Get
            Return TryCast(Me.CellTemplate, TextAndImageCell)
        End Get
    End Property
    Friend ReadOnly Property ImageSize() As Size
        Get
            Return m_imageSize
        End Get
    End Property
End Class
Public Class TextAndImageCell
    Inherits DataGridViewTextBoxCell
    Private imageValue As Image
    Private imageSize As Size
    Public Overloads Overrides Function Clone() As Object
        Dim c As TextAndImageCell = TryCast(MyBase.Clone, TextAndImageCell)
        c.imageValue = Me.imageValue
        c.imageSize = Me.imageSize
        Return c
    End Function
    Public Property Image() As Image
        Get
            If Me.OwningColumn Is Nothing OrElse Me.OwningTextAndImageColumn Is Nothing Then
                Return imageValue
            Else
                If Not (Me.imageValue Is Nothing) Then
                    Return Me.imageValue
                Else
                    Return Me.OwningTextAndImageColumn.Image
                End If
            End If
        End Get
        Set(ByVal value As Image)
            Me.imageValue = value
            Me.imageSize = value.Size
            Dim inheritedPadding As Padding = Me.InheritedStyle.Padding
            Me.Style.Padding = New Padding(imageSize.Width, inheritedPadding.Top, inheritedPadding.Right, inheritedPadding.Bottom)
        End Set
    End Property
    Protected Overloads Overrides Sub Paint(graphics As Graphics, clipBounds As Rectangle, cellBounds As Rectangle,
                                            rowIndex As Integer, cellState As DataGridViewElementStates, value As Object, formattedValue As Object,
                                            errorText As String, cellStyle As DataGridViewCellStyle, advancedBorderStyle As DataGridViewAdvancedBorderStyle,
                                            paintParts As DataGridViewPaintParts)
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)
        If Not (Me.Image Is Nothing) Then
            Dim container As System.Drawing.Drawing2D.GraphicsContainer = graphics.BeginContainer
            graphics.SetClip(cellBounds)
            graphics.DrawImageUnscaled(Me.Image, cellBounds.Location)
            graphics.EndContainer(container)
        End If
    End Sub
    Private ReadOnly Property OwningTextAndImageColumn() As TextAndImageColumn
        Get
            Return TryCast(Me.OwningColumn, TextAndImageColumn)
        End Get
    End Property
End Class

除了我使用的图像正好位于单元格的边缘外,它的效果非常好。我想给它一点点差价。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您可以将属性添加到TextAndImageCell,例如:

Private m_imagePadding As New Padding(3)

Public Property ImagePadding() As Padding
    Get
        Return m_imagePadding
    End Get
    Set(ByVal value As Padding)
        m_imagePadding = value
    End Set
End Property

并实施(在Paint中),如:

graphics.DrawImageUnscaled(Me.Image, _
         New Point(cellBounds.Location.X + m_imagePadding.Left, _
                   cellBounds.Location.Y + m_imagePadding.Top))

也需要更改TextAndImageColumn

Me.DefaultCellStyle.Padding = New Padding(ImageSize.Width + _
   TextAndImageCellTemplate.ImagePadding.Right, inheritedPadding.Top, _
   inheritedPadding.Right, inheritedPadding.Bottom)

显然有改进的空间,显然(在填充更改时触发重绘,排序行高,文本填充等)但是这样的事情应该有效。