DataGridComboBoxColumn类参考

  DataGridComboBoxColumn 类参考


该类可以用于向BriskDataGrid添加一个ComboBox列。当该列的单元格被单击时,单元格可以转换成一个ComboBox控件,用户可以使用该控件编辑单元格里的值。可以采用这种方式有效表示外键约束。


属性


ParentTable——该属性获取或者设置一个DataTable对象,该DataTable对象应该是BriskDataGrid所显示的表的父表。

ParentColumn——该属性获取或者设置一个字符串,该字符串指定父表中要从中取值的那个列。

DisplayColumn——该属性获取或者设置一个字符串,该字符串指定父表中要显示其内容的那个列。

Alignment——获取或设置列中文本的对齐方法。

HeaderText——获取或设置列标头文本。

MappingName——获取或设置用于将列样式映射到数据成员的名称。

NullText——获取或设置在列包含空引用时所显示的文本。

ReadOnly——获取或设置一个值,该值指示该列中的数据是否可以编辑。

Width——宽度。

源码参考:

Public Class DataGridComboBoxColumn
    Inherits DataGridColumnStyle

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

    Protected Sub Initialize()
        Me.ComboBox.Visible = False
        Me.ComboBox.SelectedValue = -1
        Me.ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
        Me._isEditing = False
    End Sub

    Protected ComboBox As New ComboBox
    Protected _isEditing As Boolean = False

    Public Overrides Property Width() As Integer
        Get
            Return MyBase.Width()
        End Get
        Set(ByVal Value As Integer)
            MyBase.Width = Value
            Me.ComboBox.DropDownWidth = Value - 4
        End Set
    End Property

    Protected _ParentTable As DataTable
    '父表
    Public Property ParentTable() As DataTable
        Get
            Return Me._ParentTable
        End Get
        Set(ByVal Value As DataTable)
            Me._ParentTable = Value
            Me.ComboBox.DataSource = Me._ParentTable
        End Set
    End Property

    Protected _DisplayColumn As String
    '显示在网格里的列
    Public Property DisplayColumn() As String
        Get
            Return Me._DisplayColumn
        End Get
        Set(ByVal Value As String)
            Me._DisplayColumn = Value
            Me.ComboBox.DisplayMember = Me._DisplayColumn
        End Set
    End Property

    Protected _ParentColumn As String
    '外健
    Public Property ParentColumn() As String
        Get
            Return Me._ParentColumn
        End Get
        Set(ByVal Value As String)
            Me._ParentColumn = Value
            Me.ComboBox.ValueMember = Me._ParentColumn
        End Set
    End Property

    '判断列该列是否是只读的
    Protected Function IsReadOnly()
        Return Me.ReadOnly
    End Function

    '内嵌控件值已经发生改变
    '(当DateTimePicker.Value发生改变时执行此函数)
    Protected Overridable Sub SelectedValueChanged( _
        ByVal sender As Object, ByVal e As EventArgs)
        '卸载内嵌控件的ValueChanged事件
        RemoveHandler ComboBox.SelectedValueChanged, _
            AddressOf SelectedValueChanged
        '正在编辑宿主控件(这是唯一一次将isEditing设置为true)
        Me._isEditing = True
        '通知DataGrid用户已开始编辑该列
        MyBase.ColumnStartedEditing(Me.ComboBox)
    End Sub

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

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

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

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

        '得到内嵌控件的值
        Dim value As Object = ComboBox.SelectedValue
        '用来自指定 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 Integer = GetColumnValueAtRow([source], rowNum)

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

            '设置内嵌控件的外观
            'Me.DateTimePicker.CalendarForeColor = Me.DataGridTableStyle.ForeColor
            'Me.DateTimePicker.CalendarMonthBackground = Me.DataGridTableStyle.BackColor
            'Me.DateTimePicker.CalendarTitleBackColor = Me.DataGridTableStyle.HeaderBackColor
            'Me.DateTimePicker.CalendarTitleForeColor = Me.DataGridTableStyle.HeaderForeColor
            'Me.DateTimePicker.CalendarTrailingForeColor = Me.DataGridTableStyle.ForeColor
            '可见
            Me.ComboBox.Visible = True
            '把从单元格里得到的值给内嵌控件
            ComboBox.SelectedValue = value
            '向DataGrid发送一条绘制消息,重新绘制指定区域
            DataGridTableStyle.DataGrid.Invalidate(bounds)
            'picker得到焦点
            Me.ComboBox.Focus()
            '添加事件句柄picker的ValueChanged
            AddHandler ComboBox.SelectedValueChanged, _
                AddressOf SelectedValueChanged
        Else '否则          
            '不可见
            Me.ComboBox.Visible = False
            '把从单元格里得到的值给内嵌控件
            ComboBox.SelectedValue = value
        End If
    End Sub

    Protected Overrides Function GetMinimumHeight() As Integer
        Return Me.ComboBox.PreferredHeight + 4
    End Function

    Protected Overrides Function GetPreferredHeight(ByVal g As System.Drawing.Graphics, ByVal value As Object) As Integer
        Return Me.ComboBox.PreferredHeight + 4
    End Function

    Protected Overrides Function GetPreferredSize(ByVal g As System.Drawing.Graphics, ByVal value As Object) As System.Drawing.Size
        Return New Size(100, Me.ComboBox.PreferredHeight + 4)
    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.Red, Brushes.Blue, alignToRight)
    End Sub

    Public Overrides Property Alignment() As HorizontalAlignment
        Get
            Return MyBase.Alignment
        End Get
        Set(ByVal Value As HorizontalAlignment)
            MyBase.Alignment = Value

            If Value = HorizontalAlignment.Left Then
                Me._TextFormat.Alignment = StringAlignment.Near
            ElseIf Value = HorizontalAlignment.Center Then
                Me._TextFormat.Alignment = StringAlignment.Center
            ElseIf Value = HorizontalAlignment.Right Then
                Me._TextFormat.Alignment = StringAlignment.Far
            End If
        End Set
    End Property

    Protected _TextFormat As New StringFormat

    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 obj As Object
        obj = GetColumnValueAtRow([source], rowNum)

        '根据从单元格得到的值得到应该显示的文本
        Dim dv As New DataView
        dv.Table = Me.ParentTable
        dv.RowFilter = Me.ParentColumn & " = " & obj.ToString()
        Dim str As String
        Dim dr As DataRow
        If dv.Count > 0 Then
            dr = dv.Item(0).Row
            str = dr.Item(Me.DisplayColumn).ToString()
        Else
            str = Me.NullText
        End If

        '判断是否从右向左
        If alignToRight Then
            Me._TextFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft
        End If

        '画出字符串
        rect.Offset(0, 2)
        rect.Height -= 2
        g.DrawString(str, _
            Me.DataGridTableStyle.DataGrid.Font, foreBrush, _
            RectangleF.FromLTRB(rect.X, rect.Y, rect.Right, rect.Bottom), Me._TextFormat)

    End Sub

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

        If obj.Equals(Convert.DBNull) Then
            obj = -1
        End If

        Return obj
    End Function

    Protected Overrides Sub SetColumnValueAtRow(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal value As Object)
        Dim obj As Object
        If value = Nothing Then
            obj = Convert.DBNull
        Else
            obj = value
        End If

        MyBase.SetColumnValueAtRow(source, rowNum, obj)
    End Sub

    Protected Overrides Sub SetDataGridInColumn(ByVal value As System.Windows.Forms.DataGrid)
        MyBase.SetDataGridInColumn(value)
        If Not (Me.ComboBox.Parent Is Nothing) Then
            Me.ComboBox.Parent.Controls.Remove(Me.ComboBox)
        End If
        If Not (value Is Nothing) Then
            value.Controls.Add(Me.ComboBox)
        End If
    End Sub

    Protected Overrides Sub ConcedeFocus()
        MyBase.ConcedeFocus()
        Me._isEditing = False
    End Sub
End Class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataGridComboBoxColumn是一个在WPF(Windows Presentation Foundation)中使用的控件,用于在DataGrid中显示可编辑的下拉列表。它允许用户从预定义的选项列表中选择一个值,并将所选值绑定到数据模型中的属性。 该控件通常用于呈现具有预定义选项的枚举类型或参考数据。它提供了用户友好的界面,使用户能够轻松选择和编辑下拉列表中的值。 要使用DataGridComboBoxColumn,您需要将其添加到DataGrid的列集合中,并为该列指定绑定的数据源和相关属性。您还可以定义下拉列表中的选项以及选项的显示方式。 示例代码如下: ``` <DataGridComboBoxColumn Header="Status" SelectedItemBinding="{Binding Status}"> <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding StatusOptions}" /> </Style> </DataGridComboBoxColumn.ElementStyle> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding StatusOptions}" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> ``` 在上面的示例中,我们创建了一个名为"Status"的DataGridComboBoxColumn,并将其绑定到数据模型中的"Status"属性。我们还指定了一个名为"StatusOptions"的集合,用于定义下拉列表中的选项。 请注意,具体实现可能会因您的需求和技术栈而有所不同。以上代码仅作为示例供参考

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值