`
meiowei
  • 浏览: 147546 次
  • 性别: 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  
总算找到方法了

相关推荐

    Winforms里判断DatagridView里面的CheckBox是否选中

    此外,如果你希望实现单击表头`CheckBox`全选/全不选的效果,你需要监听`DataGridView`的`CellContentClick`事件,然后检查是否点击了`CheckBox`列的表头: ```csharp private void dataGridView_CellContentClick...

    C# 技术开发

    在WinForm应用程序中,DatagridView是实现此功能的核心组件。在处理复杂用户交互时,我们可能需要在Datagrid中添加更多定制化的功能,比如在单元格内使用按钮。在标准的DataGridView中,我们可以直接使用内置的几种...

    winform的控件技巧

    15. **控件的动画效果**:通过定时器和逐步改变控件的位置、大小或透明度,可以实现简单的动画效果。 16. **错误处理**:在控件事件中添加适当的错误处理代码,如try-catch块,可以确保程序在遇到问题时能够优雅地...

    visual+c#.net+2008控件使用范例大全01

    调用`Enabled`属性可以控制控件的启用状态;而`Visible`属性则决定了控件是否可见。 对于数据绑定,控件如DataGridView可以直接与数据库连接,动态展示数据,或者通过DataSource属性绑定到数据源。这样,当数据源...

    C#控件大全(C#所有的控件)

    C#控件大全是指C#语言中提供的所有控件的集合,包括窗体、按钮、文本框、列表框、组合框、checkbox、RadioButton、 label、ProgressBar、TextBox、RichTextBox、DataGridView、ListView、TreeView等。这些控件都是C#...

    27个C#控件操作经典程序源码.rar

    7. **数据绑定**:控件可以与数据源绑定,实现数据显示和更新,例如,将数据库中的数据绑定到DataGridView控件。 8. **自定义控件**:通过继承已有的控件类,可以创建具有特定功能的自定义控件。 9. **控件集合**...

    Visual Basic.NET2008控件使用范例详解(PDF)

    1. **基础控件介绍**:书中涵盖了VB.NET 2008中最基础的控件,如Label、TextBox、Button、CheckBox、RadioButton、ListBox和ComboBox等。这些控件是构建用户界面的基本元素,用于接收用户输入、显示信息或触发事件。...

    C#经典源代码-02-控件操作.rar

    - 常用控件:熟悉Button、TextBox、Label、CheckBox、RadioButton、ComboBox、ListBox、DataGridView等常用控件的使用方法。 - 事件处理:学习如何绑定和处理控件的各种事件,如Click、TextChanged、...

    杭电 .net 常用控件

    【描述】:“杭电.NET老师那的U盘里去偷来的~含有各项常用控件的代码” 这句话暗示这个压缩包可能包含了实际的代码示例,这些示例涵盖了多种.NET常用控件的实现。通过分析和学习这些代码,开发者可以快速理解控件的...

    Visual Basic.NET控件时尚编程百例.rar

    - **复选框(CheckBox)**和**单选按钮(RadioButton)**:提供多选一或二选一的选择功能。 - **列表框(ListBox)**和**组合框(ComboBox)**:展示可选择的列表项,组合框可搜索和下拉选择。 - **进度条...

    VB.Net控件应用编程实例教程

    VB.Net提供了丰富的内置控件库,包括按钮(Button)、文本框(TextBox)、标签(Label)、复选框(CheckBox)、单选按钮(RadioButton)、列表框(ListBox)、组合框(ComboBox)等。每个控件都有其特定的功能和属性...

    Visual_C#__2008——使用常用控件.

    - **CheckBox**:用于表示二选一的选择。 - **RadioButton**:用于表示多选一的选择。 - **DataGridView**:用于显示表格数据。 通过组合使用这些控件,可以构建出功能丰富的用户界面。每个控件都具有一系列的属性...

    C#控件基本操作 适合初学者

    - DataGridView控件:用于显示和编辑表格数据,支持行、列操作。 掌握这些基础控件的使用,包括它们的属性、方法和事件,是开发C#应用程序的基础。例如,可以通过调整控件的Size和Location属性改变其大小和位置;...

    VB.NET 控件教程

    - ListBox 和 ComboBox 的衍生:DataGridView,用于显示和编辑表格数据,支持排序、过滤和行操作。 - TabControl:创建分页界面,每个页面可包含不同的控件集合。 - GroupBox:将一组相关控件组合在一起,提供...

    vb.net控件应用编程实例教程

    首先,VB.NET提供了丰富的内置控件库,如Label、TextBox、Button、ListBox、ComboBox、CheckBox、RadioButton等。这些基本控件可以满足大多数日常开发需求。例如,Label用于显示静态文本,TextBox则用于接收用户输入...

    介绍C#控件的用法的实例

    - **CheckBox**:提供复选选项,用户可以勾选或取消。 - **RadioButton**:单选按钮,用于一组互斥选项。 - **ComboBox**:组合框,结合下拉列表和文本输入框功能。 - **ListBox** 和 **ListView**:用于显示...

    C#常用控件

    - **Timer**:周期性触发事件,属性`Interval`设定触发间隔,`Enabled`决定是否启用,事件`Tick`在每次间隔后触发,方法`Start()`和`Stop()`控制计时器的启动和停止。 5. **图像相关控件**: - **PictureBox**:...

    C# WinForm开发控件详解

    - CheckBox/RadioButton:复选框和单选按钮,提供多选或二选一的选项。 - PictureBox:图片框,用于显示图像资源。 - DateTimePicker:日期时间选择器,用于选择日期和时间。 - DataGridView:数据网格视图,...

    C#控件大全_C#_控件大全_

    1. **基础控件**:这些是WinForm中最常见的元素,如**Label**用于显示静态文本,**TextBox**用于输入和显示文本,**Button**用于用户交互,点击后触发事件,**PictureBox**用于展示图片,**CheckBox**和**...

    C#Winform控件应用

    - ListBox和DataGridView:用于显示和编辑表格数据,DataGridView更强大,支持行列操作。 - ProgressBar:表示进度,常用于后台任务状态显示。 - TrackBar:滑块控件,用户可以通过滑动调整值。 - RichTextBox:...

Global site tag (gtag.js) - Google Analytics