Henry手记:WinForm Datagrid结构剖析(三)类代码
点击次数:14 次 发布日期:2008-11-26 11:12:46 作者:源代码网
|
源代码网推荐 源代码网推荐 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 ", 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 源代码网推荐 源代码网推荐 ---未完,见(三)使用代码一文--------- 源代码网推荐 源代码网推荐 声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
