`
meiowei
  • 浏览: 146243 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

实现Datagridview里checkbox的enabled效果

阅读更多

我们都知道,Datagridview控件里的checkbox是没有enabled事件的,但实际应用中我们有时会需要实现这种效果。怎么办呢?思想很简单,继承控件。

vb.net:

Public Class DataGridViewDisableCheckBoxColumn
    Inherits DataGridViewCheckBoxColumn

    Sub New()
        Me.CellTemplate = New DataGridViewDisableCheckBoxCell()
    End Sub

End Class


Public Class DataGridViewDisableCheckBoxCell
    Inherits DataGridViewCheckBoxCell

    Dim enabledValue As Boolean

    Public Property Enabled() As Boolean
        Get
            Return enabledValue
        End Get
        Set(ByVal value As Boolean)
            enabledValue = value
        End Set
    End Property

    Public Overrides Function Clone() As Object
        Dim cell As New DataGridViewDisableCheckBoxCell
        cell = MyBase.Clone
        Return cell
    End Function

    Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, ByVal clipBounds As System.Drawing.Rectangle, ByVal cellBounds As System.Drawing.Rectangle, ByVal rowIndex As Integer, ByVal elementState As System.Windows.Forms.DataGridViewElementStates, ByVal value As Object, ByVal formattedValue As Object, ByVal errorText As String, ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal advancedBorderStyle As System.Windows.Forms.DataGridViewAdvancedBorderStyle, ByVal paintParts As System.Windows.Forms.DataGridViewPaintParts)
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)

        If (Me.enabledValue) Then
            Dim cellBackground As New SolidBrush(cellStyle.BackColor)

            graphics.FillRectangle(cellBackground, cellBounds)
            cellBackground.Dispose()

            PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle)
            Dim checkBoxArea As Rectangle = cellBounds
            Dim buttonAdjustment As Rectangle = Me.BorderWidths(advancedBorderStyle)

            checkBoxArea.X += buttonAdjustment.X
            checkBoxArea.Y += buttonAdjustment.Y

            checkBoxArea.Height -= buttonAdjustment.Height
            checkBoxArea.Width -= buttonAdjustment.Width

            Dim drawInPoint As New Point(cellBounds.X + cellBounds.Width / 2 - 7, cellBounds.Y + cellBounds.Height / 2 - 7)

            CheckBoxRenderer.DrawCheckBox(graphics, drawInPoint, System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled)
        End If
    End Sub
End Class

 

c#:

public class DataGridViewDisableCheckBoxColumn : DataGridViewCheckBoxColumn
    {
        public DataGridViewDisableCheckBoxColumn()
        {
            this.CellTemplate = new DataGridViewDisableCheckBoxCell();
        }
    }

    public class DataGridViewDisableCheckBoxCell : DataGridViewCheckBoxCell
    {

        private bool enabledValue;
        /// <summary>
        /// This property decides whether the checkbox should be shown checked or unchecked.
        /// </summary>
        public bool Enabled
        {
            get
            {
                return enabledValue;
            }
            set
            {
                enabledValue = value;
            }
        }
        /// Override the Clone method so that the Enabled property is copied.
        public override object Clone()
        {
            DataGridViewDisableCheckBoxCell cell =
                (DataGridViewDisableCheckBoxCell)base.Clone();
            cell.Enabled = this.Enabled;
            return cell;
        }


        public DataGridViewDisableCheckBoxCell()
        {
 
        }
        /// <summary>
        /// Override the Paint method to show the disabled checked/unchecked datagridviewcheckboxcell.
        /// </summary>
        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds,
            int rowIndex, DataGridViewElementStates elementState, object value,
            object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            if (this.enabledValue)
            {
                SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor);
                graphics.FillRectangle(cellBackground, cellBounds);
                cellBackground.Dispose();
                PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
                Rectangle checkBoxArea = cellBounds;
                Rectangle buttonAdjustment = this.BorderWidths(advancedBorderStyle);
                checkBoxArea.X += buttonAdjustment.X;
                checkBoxArea.Y += buttonAdjustment.Y;

                checkBoxArea.Height -= buttonAdjustment.Height;
                checkBoxArea.Width -= buttonAdjustment.Width;
                Point drawInPoint = new Point(cellBounds.X + cellBounds.Width / 2 - 7, cellBounds.Y + cellBounds.Height / 2 - 7);

                CheckBoxRenderer.DrawCheckBox(graphics, drawInPoint, System.Windows.Forms.VisualStyles.CheckBoxState.CheckedDisabled);

            }
        }
    }

 

使用方法很简单,将datagridview里的checkbox控件定义为DataGridViewDisableCheckBoxColumn型,将其enabled属性设置为true,就会看到效果。需要注意的地方是,虽然看起来控件是灰色,并且鼠标点击的时候checkbox选中状态不会改变,但是,该控件的value值还是改变了,如果你不想点击的时候改变其value值,那么再设置控件的Readonly=False。

分享到:
评论
1 楼 hk8082 2011-09-23  
总算找到方法了

相关推荐

Global site tag (gtag.js) - Google Analytics