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