Henry手记:WinForm Datagrid结构剖析(三)类代码

-------------------X类的代码X---------------------

Option Strict On

Option Explicit On

Imports System.Collections

Imports System.ComponentModel

Imports System.Drawing

Imports System.Windows.Forms

Imports System.Data

 

Public Class DataGridComboBox 

‘与DataGridTextBox类相类似地定义一个在下拉框列类中使用的ComboBox

    Inherits ComboBox

    Public Sub New()

        MyBase.New()

    End Sub

    Public isInEditOrNavigateMode As Boolean = True

End Class

 

Public Class DataGridComboBoxColumn

    Inherits DataGridColumnStyle

     ' 与用户界面相关的变量   

     Private xMargin As Integer = 2

    Private yMargin As Integer = 1

    Private Combo As DataGridComboBox

    Private _DisplayMember As String

    Private _ValueMember As String

    ' 用于跟踪编辑状态变化的变量

    Private OldVal As String = String.Empty

    Private InEdit As Boolean = False

    '构造函数 – 实例的DisplayMember, ValueMember值为由父类传来的integer类型的值

    Public Sub New(ByRef DataSource As DataTable, _

                   ByVal DisplayMember As Integer, _

                   ByVal ValueMember As Integer)

        Combo = New DataGridComboBox()

        _DisplayMember = DataSource.Columns.Item(index:=DisplayMember).ToString

        _ValueMember = DataSource.Columns.Item(index:=ValueMember).ToString

        With Combo

            .Visible = False

            .DataSource = DataSource

            .DisplayMember = _DisplayMember

            .ValueMember = _ValueMember

        End With

    End Sub

    '构造函数– 实例的DisplayMember, ValueMember 是String类型的值

    Public Sub New(ByRef DataSource As DataTable, _

                   ByVal DisplayMember As String, _

                   ByVal ValueMember As String)

        Combo = New DataGridComboBox()

        With Combo

            .Visible = False

            .DataSource = DataSource

            .DisplayMember = DisplayMember

            .ValueMember = ValueMember

        End With

    End Sub

    '------------------------------------------------------

    '从 DataGridColumnStyle类继承下来的方法

    '------------------------------------------------------

    ' 焦点离开combobox格后的改变

    Protected Overloads Overrides Sub Abort(ByVal RowNum As Integer)

        Debug.WriteLine("Abort()")

        RollBack()

        HideComboBox()

        EndEdit()

    End Sub

    ' 接受改变

    Protected Overloads Overrides Function Commit(ByVal DataSource As CurrencyManager, _

                                          ByVal RowNum As Integer) As Boolean

        HideComboBox()

        If Not InEdit Then

            Return True

        End If

        Try

            Dim Value As Object = Combo.SelectedValue

            If NullText.Equals(Value) Then

                Value = Convert.DBNull

            End If

            SetColumnValueAtRow(DataSource, RowNum, Value)

        Catch e As Exception

            RollBack()

            Return False

        End Try

        EndEdit()

        Return True

    End Function

    ' 移开聚焦

    Protected Overloads Overrides Sub ConcedeFocus()

        Combo.Visible = False

    End Sub

    ' 编辑单元格

    Protected Overloads Overrides Sub Edit(ByVal Source As CurrencyManager, _

                                           ByVal Rownum As Integer, _

                                           ByVal Bounds As Rectangle, _

                                           ByVal [ReadOnly] As Boolean, _

                                           ByVal InstantText As String, _

                                           ByVal CellIsVisible As Boolean)

        Combo.Text = String.Empty

        Dim OriginalBounds As Rectangle = Bounds

        OldVal = Combo.Text

        If CellIsVisible Then

            Bounds.Offset(xMargin, yMargin)

            Bounds.Width -= xMargin * 2

            Bounds.Height -= yMargin

            Combo.Bounds = Bounds

            Combo.Visible = True

        Else

            Combo.Bounds = OriginalBounds

            Combo.Visible = False

        End If

        Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum))

        If Not InstantText Is Nothing Then

            Combo.SelectedValue = InstantText

        End If

        Combo.RightToLeft = Me.DataGridTableStyle.DataGrid.RightToLeft

        Combo.Focus()

        If InstantText Is Nothing Then

            Combo.SelectAll()

        Else

            Dim [End] As Integer = Combo.Text.Length

            Combo.Select([End], 0)

        End If

        If Combo.Visible Then

            DataGridTableStyle.DataGrid.Invalidate(OriginalBounds)

        End If

        InEdit = True

    End Sub

    Protected Overloads Overrides Function GetMinimumHeight() As Integer

        ' 设置combobox的最小高度

        Return Combo.PreferredHeight + yMargin

    End Function

    Protected Overloads Overrides Function GetPreferredHeight(ByVal g As Graphics, _

                                         ByVal Value As Object) As Integer

        Debug.WriteLine("GetPreferredHeight()")

        Dim NewLineIndex As Integer = 0

        Dim NewLines As Integer = 0

        Dim ValueString As String = Me.GetText(Value)

        Do

            While NewLineIndex <> -1

                NewLineIndex = ValueString.IndexOf("r/n", NewLineIndex + 1)

                NewLines += 1

            End While

        Loop

        Return FontHeight * NewLines + yMargin

    End Function

    Protected Overloads Overrides Function GetPreferredSize(ByVal g As Graphics, _

                                                   ByVal Value As Object) As Size

        Dim Extents As Size = Size.Ceiling(g.MeasureString(GetText(Value), _

                                    Me.DataGridTableStyle.DataGrid.Font))

        Extents.Width += xMargin * 2 + DataGridTableGridLineWidth

        Extents.Height += yMargin

        Return Extents

    End Function

    Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _

                                            ByVal Bounds As Rectangle, _

                                            ByVal Source As CurrencyManager, _

                                            ByVal RowNum As Integer)

        Paint(g, Bounds, Source, RowNum, False)

    End Sub

    Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _

                                            ByVal Bounds As Rectangle, _

                                            ByVal Source As CurrencyManager, _

                                            ByVal RowNum As Integer, _

                                            ByVal AlignToRight As Boolean)

        Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum))

        PaintText(g, Bounds, Text, AlignToRight)

    End Sub

    Protected Overloads Sub Paint(ByVal g As Graphics, _

                                  ByVal Bounds As Rectangle, _

                                  ByVal Source As CurrencyManager, _

                                  ByVal RowNum As Integer, _

                                  ByVal BackBrush As Brush, _

                                  ByVal ForeBrush As Brush, _

                                  ByVal AlignToRight As Boolean)

 

        Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum))

        PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight)

    End Sub

    Protected Overloads Overrides Sub SetDataGridInColumn(ByVal Value As DataGrid)

        MyBase.SetDataGridInColumn(Value)

        If Not (Combo.Parent Is Value) Then

            If Not (Combo.Parent Is Nothing) Then

                Combo.Parent.Controls.Remove(Combo)

            End If

        End If

        If Not (Value Is Nothing) Then Value.Controls.Add(Combo)

    End Sub

    Protected Overloads Overrides Sub UpdateUI(ByVal Source As CurrencyManager, _

                              Val RowNum As Integer, ByVal InstantText As String)

        Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum))

        If Not (InstantText Is Nothing) Then

            Combo.Text = InstantText

        End If

    End Sub

---未完,见(三)使用代码一文---------

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值