|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
| |
| WinForm Datagrid结构剖析(三)类代码 |
|
-------------------X类的代码X--------------------- YAALinux联盟 YAALinux联盟 Option Strict On YAALinux联盟 YAALinux联盟 Option Explicit On YAALinux联盟 YAALinux联盟 Imports System.Collections YAALinux联盟 YAALinux联盟 Imports System.ComponentModel YAALinux联盟 YAALinux联盟 Imports System.Drawing YAALinux联盟 YAALinux联盟 Imports System.Windows.Forms YAALinux联盟 YAALinux联盟 Imports System.Data YAALinux联盟 YAALinux联盟 YAALinux联盟 YAALinux联盟 Public Class DataGridComboBox YAALinux联盟 YAALinux联盟 ‘与DataGridTextBox类相类似地定义一个在下拉框列类中使用的ComboBox YAALinux联盟 YAALinux联盟 Inherits ComboBox YAALinux联盟 YAALinux联盟 Public Sub New() YAALinux联盟 YAALinux联盟 MyBase.New() YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Public isInEditOrNavigateMode As Boolean = True YAALinux联盟 YAALinux联盟 End Class YAALinux联盟 YAALinux联盟 YAALinux联盟 YAALinux联盟 Public Class DataGridComboBoxColumn YAALinux联盟 YAALinux联盟 Inherits DataGridColumnStyle YAALinux联盟 YAALinux联盟 ' 与用户界面相关的变量 YAALinux联盟 YAALinux联盟 Private xMargin As Integer = 2 YAALinux联盟 YAALinux联盟 Private yMargin As Integer = 1 YAALinux联盟 YAALinux联盟 Private Combo As DataGridComboBox YAALinux联盟 YAALinux联盟 Private _DisplayMember As String YAALinux联盟 YAALinux联盟 Private _ValueMember As String YAALinux联盟 YAALinux联盟 ' 用于跟踪编辑状态变化的变量 YAALinux联盟 YAALinux联盟 Private OldVal As String = String.Empty YAALinux联盟 YAALinux联盟 Private InEdit As Boolean = False YAALinux联盟 YAALinux联盟 '构造函数 – 实例的DisplayMember, ValueMember值为由父类传来的integer类型的值 YAALinux联盟 YAALinux联盟 Public Sub New(ByRef DataSource As DataTable, _ YAALinux联盟 YAALinux联盟 ByVal DisplayMember As Integer, _ YAALinux联盟 YAALinux联盟 ByVal ValueMember As Integer) YAALinux联盟 YAALinux联盟 Combo = New DataGridComboBox() YAALinux联盟 YAALinux联盟 _DisplayMember = DataSource.Columns.Item(index:=DisplayMember).ToString YAALinux联盟 YAALinux联盟 _ValueMember = DataSource.Columns.Item(index:=ValueMember).ToString YAALinux联盟 YAALinux联盟 With Combo YAALinux联盟 YAALinux联盟 .Visible = False YAALinux联盟 YAALinux联盟 .DataSource = DataSource YAALinux联盟 YAALinux联盟 .DisplayMember = _DisplayMember YAALinux联盟 YAALinux联盟 .ValueMember = _ValueMember YAALinux联盟 YAALinux联盟 End With YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 '构造函数– 实例的DisplayMember, ValueMember 是String类型的值 YAALinux联盟 YAALinux联盟 Public Sub New(ByRef DataSource As DataTable, _ YAALinux联盟 YAALinux联盟 ByVal DisplayMember As String, _ YAALinux联盟 YAALinux联盟 ByVal ValueMember As String) YAALinux联盟 YAALinux联盟 Combo = New DataGridComboBox() YAALinux联盟 YAALinux联盟 With Combo YAALinux联盟 YAALinux联盟 .Visible = False YAALinux联盟 YAALinux联盟 .DataSource = DataSource YAALinux联盟 YAALinux联盟 .DisplayMember = DisplayMember YAALinux联盟 YAALinux联盟 .ValueMember = ValueMember YAALinux联盟 YAALinux联盟 End With YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 '------------------------------------------------------ YAALinux联盟 YAALinux联盟 '从 DataGridColumnStyle类继承下来的方法 YAALinux联盟 YAALinux联盟 '------------------------------------------------------ YAALinux联盟 YAALinux联盟 ' 焦点离开combobox格后的改变 YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub Abort(ByVal RowNum As Integer) YAALinux联盟 YAALinux联盟 Debug.WriteLine("Abort()") YAALinux联盟 YAALinux联盟 RollBack() YAALinux联盟 YAALinux联盟 HideComboBox() YAALinux联盟 YAALinux联盟 EndEdit() YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 ' 接受改变 YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Function Commit(ByVal DataSource As CurrencyManager, _ YAALinux联盟 YAALinux联盟 ByVal RowNum As Integer) As Boolean YAALinux联盟 YAALinux联盟 HideComboBox() YAALinux联盟 YAALinux联盟 If Not InEdit Then YAALinux联盟 YAALinux联盟 Return True YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 Try YAALinux联盟 YAALinux联盟 Dim Value As Object = Combo.SelectedValue YAALinux联盟 YAALinux联盟 If NullText.Equals(Value) Then YAALinux联盟 YAALinux联盟 Value = Convert.DBNull YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 SetColumnValueAtRow(DataSource, RowNum, Value) YAALinux联盟 YAALinux联盟 Catch e As Exception YAALinux联盟 YAALinux联盟 RollBack() YAALinux联盟 YAALinux联盟 Return False YAALinux联盟 YAALinux联盟 End Try YAALinux联盟 YAALinux联盟 EndEdit() YAALinux联盟 YAALinux联盟 Return True YAALinux联盟 YAALinux联盟 End Function YAALinux联盟 YAALinux联盟 ' 移开聚焦 YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub ConcedeFocus() YAALinux联盟 YAALinux联盟 Combo.Visible = False YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 ' 编辑单元格 YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub Edit(ByVal Source As CurrencyManager, _ YAALinux联盟 YAALinux联盟 ByVal Rownum As Integer, _ YAALinux联盟 YAALinux联盟 ByVal Bounds As Rectangle, _ YAALinux联盟 YAALinux联盟 ByVal [ReadOnly] As Boolean, _ YAALinux联盟 YAALinux联盟 ByVal InstantText As String, _ YAALinux联盟 YAALinux联盟 ByVal CellIsVisible As Boolean) YAALinux联盟 YAALinux联盟 Combo.Text = String.Empty YAALinux联盟 YAALinux联盟 Dim OriginalBounds As Rectangle = Bounds YAALinux联盟 YAALinux联盟 OldVal = Combo.Text YAALinux联盟 YAALinux联盟 If CellIsVisible Then YAALinux联盟 YAALinux联盟 Bounds.Offset(xMargin, yMargin) YAALinux联盟 YAALinux联盟 Bounds.Width -= xMargin * 2 YAALinux联盟 YAALinux联盟 Bounds.Height -= yMargin YAALinux联盟 YAALinux联盟 Combo.Bounds = Bounds YAALinux联盟 YAALinux联盟 Combo.Visible = True YAALinux联盟 YAALinux联盟 Else YAALinux联盟 YAALinux联盟 Combo.Bounds = OriginalBounds YAALinux联盟 YAALinux联盟 Combo.Visible = False YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 Combo.SelectedValue = GetText(GetColumnValueAtRow(Source, Rownum)) YAALinux联盟 YAALinux联盟 If Not InstantText Is Nothing Then YAALinux联盟 YAALinux联盟 Combo.SelectedValue = InstantText YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 Combo.RightToLeft = Me.DataGridTableStyle.DataGrid.RightToLeft YAALinux联盟 YAALinux联盟 Combo.Focus() YAALinux联盟 YAALinux联盟 If InstantText Is Nothing Then YAALinux联盟 YAALinux联盟 Combo.SelectAll() YAALinux联盟 YAALinux联盟 Else YAALinux联盟 YAALinux联盟 Dim [End] As Integer = Combo.Text.Length YAALinux联盟 YAALinux联盟 Combo.Select([End], 0) YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 If Combo.Visible Then YAALinux联盟 YAALinux联盟 DataGridTableStyle.DataGrid.Invalidate(OriginalBounds) YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 InEdit = True YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Function GetMinimumHeight() As Integer YAALinux联盟 YAALinux联盟 ' 设置combobox的最小高度 YAALinux联盟 YAALinux联盟 Return Combo.PreferredHeight + yMargin YAALinux联盟 YAALinux联盟 End Function YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Function GetPreferredHeight(ByVal g As Graphics, _ YAALinux联盟 YAALinux联盟 ByVal Value As Object) As Integer YAALinux联盟 YAALinux联盟 Debug.WriteLine("GetPreferredHeight()") YAALinux联盟 YAALinux联盟 Dim NewLineIndex As Integer = 0 YAALinux联盟 YAALinux联盟 Dim NewLines As Integer = 0 YAALinux联盟 YAALinux联盟 Dim ValueString As String = Me.GetText(Value) YAALinux联盟 YAALinux联盟 Do YAALinux联盟 YAALinux联盟 While NewLineIndex <> -1 YAALinux联盟 YAALinux联盟 NewLineIndex = ValueString.IndexOf("r\n", NewLineIndex + 1) YAALinux联盟 YAALinux联盟 NewLines += 1 YAALinux联盟 YAALinux联盟 End While YAALinux联盟 YAALinux联盟 Loop YAALinux联盟 YAALinux联盟 Return FontHeight * NewLines + yMargin YAALinux联盟 YAALinux联盟 End Function YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Function GetPreferredSize(ByVal g As Graphics, _ YAALinux联盟 YAALinux联盟 ByVal Value As Object) As Size YAALinux联盟 YAALinux联盟 Dim Extents As Size = Size.Ceiling(g.MeasureString(GetText(Value), _ YAALinux联盟 YAALinux联盟 Me.DataGridTableStyle.DataGrid.Font)) YAALinux联盟 YAALinux联盟 Extents.Width += xMargin * 2 + DataGridTableGridLineWidth YAALinux联盟 YAALinux联盟 Extents.Height += yMargin YAALinux联盟 YAALinux联盟 Return Extents YAALinux联盟 YAALinux联盟 End Function YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _ YAALinux联盟 YAALinux联盟 ByVal Bounds As Rectangle, _ YAALinux联盟 YAALinux联盟 ByVal Source As CurrencyManager, _ YAALinux联盟 YAALinux联盟 ByVal RowNum As Integer) YAALinux联盟 YAALinux联盟 Paint(g, Bounds, Source, RowNum, False) YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _ YAALinux联盟 YAALinux联盟 ByVal Bounds As Rectangle, _ YAALinux联盟 YAALinux联盟 ByVal Source As CurrencyManager, _ YAALinux联盟 YAALinux联盟 ByVal RowNum As Integer, _ YAALinux联盟 YAALinux联盟 ByVal AlignToRight As Boolean) YAALinux联盟 YAALinux联盟 Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum)) YAALinux联盟 YAALinux联盟 PaintText(g, Bounds, Text, AlignToRight) YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Protected Overloads Sub Paint(ByVal g As Graphics, _ YAALinux联盟 YAALinux联盟 ByVal Bounds As Rectangle, _ YAALinux联盟 YAALinux联盟 ByVal Source As CurrencyManager, _ YAALinux联盟 YAALinux联盟 ByVal RowNum As Integer, _ YAALinux联盟 YAALinux联盟 ByVal BackBrush As Brush, _ YAALinux联盟 YAALinux联盟 ByVal ForeBrush As Brush, _ YAALinux联盟 YAALinux联盟 ByVal AlignToRight As Boolean) YAALinux联盟 YAALinux联盟 YAALinux联盟 YAALinux联盟 Dim Text As String = GetText(GetColumnValueAtRow(Source, RowNum)) YAALinux联盟 YAALinux联盟 PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight) YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub SetDataGridInColumn(ByVal Value As DataGrid) YAALinux联盟 YAALinux联盟 MyBase.SetDataGridInColumn(Value) YAALinux联盟 YAALinux联盟 If Not (Combo.Parent Is Value) Then YAALinux联盟 YAALinux联盟 If Not (Combo.Parent Is Nothing) Then YAALinux联盟 YAALinux联盟 Combo.Parent.Controls.Remove(Combo) YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 If Not (Value Is Nothing) Then Value.Controls.Add(Combo) YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 Protected Overloads Overrides Sub UpdateUI(ByVal Source As CurrencyManager, _ YAALinux联盟 YAALinux联盟 Val RowNum As Integer, ByVal InstantText As String) YAALinux联盟 YAALinux联盟 Combo.Text = GetText(GetColumnValueAtRow(Source, RowNum)) YAALinux联盟 YAALinux联盟 If Not (InstantText Is Nothing) Then YAALinux联盟 YAALinux联盟 Combo.Text = InstantText YAALinux联盟 YAALinux联盟 End If YAALinux联盟 YAALinux联盟 End Sub YAALinux联盟 YAALinux联盟 ---未完,见(三)使用代码一文--------- YAALinux联盟 YAALinux联盟 声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|