现在的位置: 首页 > 综合 > 正文

DataGridCheckBoxColumn类参考

2013年05月12日 ⁄ 综合 ⁄ 共 9215字 ⁄ 字号 评论关闭
 

DataGridCheckBoxColumn类参考

该类继承自DataGridColumnStyle类。该类可以用于向BriskDataGrid添加一个CheckBox列。

属性

AllowNull——决定列是否允许空值。该属性是一个布尔值。true,允许单元格接受空值; false,不允许单元格接受空值。默认值为false

NullValue——获取或设置在将列值设置为空时使用的实际值。默认值为DBNull。该属性是object类型,可以接受任何值。

TrueValue——获取或设置在将列值设置为true时使用的实际值。默认值为True。该属性是object类型,可以接受任何值。

FalseValue——获取或设置在将列值设置为false时使用的实际值。默认值为False。该属性是object类型,可以接受任何值。

HeaderText——获取或设置列标头的文本。该属性接受一个字符串。

MappingName——获取或设置用于将列样式映射到的数据成员的名称。该属性接受一个字符串。

ReadOnly——决定该列中的数据是否是可以编辑。该属性接受布尔值。

Width——列宽。

源码参考:

Public Class DataGridCheckBoxColumn
    Inherits DataGridColumnStyle

    Public Sub New()
        Me.Initialize()
    End Sub

    Private Sub Initialize()
        Me.Alignment = HorizontalAlignment.Center

        Me.CheckBox.Checked = False
        Me.CheckBox.Text = ""
        Me.CheckBox.CheckAlign = ContentAlignment.MiddleCenter
        Me.CheckBox.Visible = False
    End Sub

    Protected _AllowNull As Boolean = False
    '是否允许空值
    Public Property AllowNull() As Boolean
        Get
            Return Me._AllowNull
        End Get
        Set(ByVal Value As Boolean)
            Me._AllowNull = Value
            Me.CheckBox.ThreeState = Me._AllowNull
        End Set
    End Property

    Protected _NullValue As Object = Convert.DBNull
    '获取或设置在将列值设置为空时使用的实际值
    Public Property NullValue() As Object
        Get
            Return Me._NullValue
        End Get
        Set(ByVal Value As Object)
            Me._NullValue = Value
        End Set
    End Property

    Protected _TrueValue As Object = True
    '获取或设置在将列值设置为true时使用的实际值
    Public Property TrueValue() As Object
        Get
            Return Me._TrueValue
        End Get
        Set(ByVal Value As Object)
            Me._TrueValue = Value
        End Set
    End Property

    Protected _FalseValue As Object = False
    '获取或设置在将列值设置为false时使用的实际值
    Public Property FalseValue() As Object
        Get
            Return Me._FalseValue
        End Get
        Set(ByVal Value As Object)
            Me._FalseValue = Value
        End Set
    End Property

    '内嵌控件
    Protected CheckBox As New CheckBox
    '标志列是否正在被编辑
    Protected _isEditing As Boolean = False

    Protected Sub CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        '卸载内嵌控件的ValueChanged事件
        RemoveHandler CheckBox.CheckedChanged, _
            AddressOf CheckedChanged
        '正在编辑列(这是唯一一次将isEditing设置为true)
        Me._isEditing = True
        '通知DataGrid用户已开始编辑该列
        MyBase.ColumnStartedEditing(Me.CheckBox)
    End Sub

    '只读策略
    Protected Function IsReadOnly()
        Return Me.ReadOnly
    End Function

    Protected Overrides Sub Abort(ByVal rowNum As Integer)
        '用户没有正在编辑宿主控件
        _isEditing = False
        '卸载内嵌控件的ValueChanged句柄
        RemoveHandler CheckBox.CheckedChanged, _
            AddressOf CheckedChanged
        '重新绘制列并向控件发送一条绘制消息
        Invalidate()
    End Sub

    Protected Overrides Function Commit(ByVal dataSource As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Boolean
        '置零内嵌控件的显示区域
        CheckBox.Bounds = Rectangle.Empty

        '卸载内嵌控件的ValueChanged句柄
        RemoveHandler CheckBox.CheckedChanged, _
            AddressOf CheckedChanged

        '如果isEditing不为真
        If Not _isEditing Then
            Return True '返回true
        End If
        'isEditing等于false
        _isEditing = False

        '得到内嵌控件的值
        Dim value As Object
        If Me.CheckBox.ThreeState = True Then
            If Me.CheckBox.CheckState = CheckState.Checked Then
                value = Me.TrueValue
            ElseIf Me.CheckBox.CheckState = CheckState.Unchecked Then
                value = Me.FalseValue
            ElseIf Me.CheckBox.CheckState = CheckState.Indeterminate Then
                value = Me.NullValue
            End If
        Else
            If Me.CheckBox.Checked = True Then
                value = Me.TrueValue
            ElseIf Me.CheckBox.Checked = False Then
                value = Me.FalseValue
            End If
        End If

        '用来自指定 CurrencyManager 的值设置指定行中的值
        SetColumnValueAtRow(dataSource, rowNum, value)

        '重新绘制列并向控件发送一条绘制消息
        Invalidate()
        '返回true
        Return True
    End Function

    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)
        '如果列是只读的
        If Me.IsReadOnly Then
            '就从这里返回,不让单元格成为picker
            Return
        End If

        '从单元格得到值     
        Dim value As Object = Me.GetColumnValueAtRow(source, rowNum)

        '把从单元格里得到的值给内嵌控件
        If Me.CheckBox.CheckState Then
            If value.Equals(Me.TrueValue) Then
                Me.CheckBox.CheckState = CheckState.Checked
            ElseIf value.Equals(Me.FalseValue) Then
                Me.CheckBox.CheckState = CheckState.Unchecked
            ElseIf value.Equals(Me.NullValue) Then
                Me.CheckBox.CheckState = CheckState.Indeterminate
            End If
        Else
            If value.Equals(Me.TrueValue) Then
                Me.CheckBox.Checked = True
            ElseIf value.Equals(Me.FalseValue) Then
                Me.CheckBox.Checked = False
            End If
        End If

        '如果单元格是可见的值
        If cellIsVisible Then
            '内嵌控件在单元格之内,小高和宽都小2像素
            CheckBox.Bounds = New Rectangle _
            (bounds.X + 2, bounds.Y + 2, bounds.Width - 4, _
            bounds.Height - 4)

            '设置内嵌控件的外观
            Me.CheckBox.BackColor = Me.DataGridTableStyle.SelectionBackColor

            '可见
            CheckBox.Visible = True
            '向DataGrid发送一条绘制消息,重新绘制指定区域
            DataGridTableStyle.DataGrid.Invalidate(bounds)
            'picker得到焦点
            CheckBox.Focus()
            '添加事件句柄picker的ValueChanged
            AddHandler CheckBox.CheckedChanged, _
                AddressOf CheckedChanged
        Else '否则          
            '不可见
            CheckBox.Visible = False
        End If
    End Sub

    Protected Overrides Function GetMinimumHeight() As Integer

    End Function

    Protected Overrides Function GetPreferredHeight(ByVal g As System.Drawing.Graphics, ByVal value As Object) As Integer

    End Function

    Protected Overrides Function GetPreferredSize(ByVal g As System.Drawing.Graphics, ByVal value As Object) As System.Drawing.Size

    End Function

    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)
        Me.Paint(g, bounds, source, rowNum, False)
    End Sub

    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 alignToRight As Boolean)
        Me.Paint(g, bounds, source, rowNum, Brushes.Blue, Brushes.Red, alignToRight)
    End Sub

    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 rect As Rectangle = bounds
        '填充单元格背景
        g.FillRectangle(backBrush, rect)

        Dim state As ButtonState
        Dim obj As Object
        obj = Me.GetColumnValueAtRow(source, rowNum)
        If obj.Equals(Me.TrueValue) Then
            state = ButtonState.Checked
        ElseIf obj.Equals(Me.FalseValue) Then
            state = ButtonState.Normal
        ElseIf obj.Equals(Me.NullValue) Then
            state = ButtonState.Inactive
        End If
        Dim lon As Integer = 14 '里边的小方格的边长
        Dim x As Integer = bounds.Width / 2 - lon / 2 + bounds.X
        Dim y As Integer = bounds.Height / 2 - lon / 2 + bounds.Y
        Dim width As Integer = lon
        Dim height As Integer = lon
        rect = New Rectangle(x, y, width, height)
        ControlPaint.DrawCheckBox(g, rect, state)
    End Sub

    Protected Overrides Function GetColumnValueAtRow(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Object
        Dim obj As Object = MyBase.GetColumnValueAtRow(source, rowNum)

        If obj Is Nothing Then
            Throw New Exception("从单元格传递来的值是" & obj.ToString() & "。")
        End If

        If obj.Equals(Me.TrueValue) Then
            Return Me.TrueValue
        ElseIf obj.Equals(Me.FalseValue) Then
            Return Me.FalseValue
        ElseIf obj.Equals(Me.NullValue) Then
            Return Me.NullValue
        Else
            Throw New Exception("从单元格传递来的值即不等于TrueValue,又不等于FalseValue,也不等于NullValue。是一个怪值。")
        End If
    End Function

    Protected Overrides Sub SetColumnValueAtRow(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal value As Object)
        If value Is Nothing Then
            Throw New Exception("从内嵌控件传递来的值是" & value.ToString() & "。")
        End If

        Dim obj As Object
        If value.Equals(Me.TrueValue) Then
            obj = Me.TrueValue
        ElseIf value.Equals(Me.FalseValue) Then
            obj = Me.FalseValue
        ElseIf value.Equals(Me.NullValue) Then
            obj = Me.NullValue
        Else
            Throw New Exception("从内嵌控件传递来的值即不等于TrueValue,又不等于FalseValue,也不等于NullValue。是一个怪值。")
        End If
        '调用父类的同名方法,把从内嵌控件传递来的值传递给单元格
        MyBase.SetColumnValueAtRow(source, rowNum, obj)
    End Sub

    Protected Overrides Sub SetDataGridInColumn(ByVal value As System.Windows.Forms.DataGrid)
        '调用父类的此函数
        MyBase.SetDataGridInColumn(value)
        '如果picker的父控件不是nothing
        If Not (CheckBox.Parent Is Nothing) Then
            '从picker的父控件里卸载picker
            CheckBox.Parent.Controls.Remove(CheckBox)
        End If
        '如果value(DataGrid)不是noting
        If Not (value Is Nothing) Then
            '把Picker添加到value(DataGrid)的Controls里面
            value.Controls.Add(CheckBox)
        End If
    End Sub

    Protected Overrides Sub ConcedeFocus()
        '调用父类的放弃焦点
        MyBase.ConcedeFocus()
        '列没有被编辑
        Me._isEditing = False
    End Sub
End Class

 

【上篇】
【下篇】

抱歉!评论已关闭.