1/1页1 跳转到查看:188
发新话题 回复该主题

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

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

摘要:Henry手记:WinFormDatagrid结构剖析(三)类代码

-------------------X类的代码X---------------------office:office" />
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
---未完,见(三)使用代码一文---------
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。


 


首页
| 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 |
HowNot?? 你知道不?http://www.hownot.cn

TOP

 
1/1页1 跳转到
发表新主题 回复该主题