DataGridCheckBoxColumn类参考

 

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





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在WPF中,要获取DataGridDataGridCheckBoxColumn选中的数据,可以通过以下步骤实现: 1. 首先,给DataGridCheckBoxColumn绑定一个数据源:在XAML中,通过设置DataGridCheckBoxColumn的Binding属性,将其绑定到ViewModel中的一个布尔型数据中。 ```xaml <DataGridCheckBoxColumn Header="选择" Binding="{Binding IsSelected}" /> ``` 2. 然后,在ViewModel中创建一个集合,用于存储选中的数据。 ```csharp private ObservableCollection<Item> selectedItems = new ObservableCollection<Item>(); public ObservableCollection<Item> SelectedItems { get { return selectedItems; } set { selectedItems = value; OnPropertyChanged(); } } ``` 其中,Item为数据源中的实体,包含需要显示在DataGrid中的数据。 3. 接下来,在ViewModel中,监听DataGridCheckBox被选中的事件。当选中状态改变时,将选中的行数据添加到SelectedItems集合中。 ```csharp public void CheckBox_Checked(object sender, RoutedEventArgs e) { var checkBox = sender as CheckBox; var item = checkBox.DataContext as Item; SelectedItems.Add(item); } ``` 4. 最后,在XAML中,将DataGrid的SelectedItems属性绑定到ViewModel中的SelectedItems集合: ```xaml <DataGrid SelectedItems="{Binding SelectedItems}" ... > ``` 这样,当CheckBox被选中时,SelectedItems集合会自动更新,其中存储了选中的行数据。 ### 回答2: 在WPF中获取DataGridDataGridCheckBoxColumn选中的数据可以通过以下步骤实现: 1. 确定DataGridCheckBoxColumn所在的列索引。可以使用Visual Studio的XAML设计器或通过代码查找DataGridColumns集合以确定列索引。 2. 遍历DataGrid的Items集合,获取每一行的DataGridRow对象。 3. 通过DataGridRow对象的Item属性获取与行关联的数据对象。 4. 通过DataGridCheckBoxColumn的列索引,获取该列中CheckBox元素的值。 5. 如果CheckBox的IsChecked属性为True,表示该行的CheckBox选中,可以将关联的数据对象添加到选中数据集合中。 以下是一个示例代码: ```csharp List<DataObject> selectedData = new List<DataObject>(); int checkBoxColumnIndex = 3; // CheckBox列的索引 foreach (DataGridRow row in myDataGrid.Items) { DataObject data = (DataObject)row.Item; CheckBox checkBox = myDataGrid.Columns[checkBoxColumnIndex].GetCellContent(row) as CheckBox; if (checkBox != null && checkBox.IsChecked == true) { selectedData.Add(data); } } // 现在,selectedData列表中包含了选中的数据对象 ``` 示例代码中的"DataObject"指代你的实际数据型。请根据实际情况进行调整。 这样,你就可以通过遍历DataGrid的行和获取CheckBox列中的值,来获取DataGridCheckBoxColumn选中的数据。 ### 回答3: 在WPF中,要获取DataGridDataGridCheckBoxColumn选中的数据,可以按照以下步骤进行操作: 1. 首先,在XAML文件中定义一个DataGrid,并定义DataGridCheckBoxColumn列,例如: ```xaml <DataGrid x:Name="MyDataGrid"> <DataGrid.Columns> <DataGridCheckBoxColumn Header="选择" Binding="{Binding IsChecked}" /> <!-- 其他列定义 --> </DataGrid.Columns> </DataGrid> ``` 2. 在后台代码中,创建一个集合用于存储选中的数据,使用一个数据绑定将该集合与DataGrid的ItemsSource属性进行绑定,例如: ```csharp List<MyDataModel> selectedData = new List<MyDataModel>(); MyDataGrid.ItemsSource = selectedData; ``` 3. 通过遍历DataGrid的所有行,以及DataGridCheckBoxColumn列的数据绑定,来判断哪些行被选中,将选中的数据添加到selectedData集合中,可以通过以下代码实现: ```csharp foreach (MyDataModel item in MyDataGrid.Items) { DataGridRow row = MyDataGrid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; if (row != null) { DataGridCheckBoxColumn checkBoxColumn = MyDataGrid.Columns[0] as DataGridCheckBoxColumn; FrameworkElement element = checkBoxColumn.GetCellContent(row); CheckBox checkBox = element as CheckBox; if (checkBox != null && checkBox.IsChecked == true) { selectedData.Add(item); } } } ``` 4. 最后,selectedData集合中存储着所有选中的数据,可以根据业务需求进行后续处理。 以上就是在WPF中获取DataGridDataGridCheckBoxColumn选中的数据的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值