接(三)类代码一文:(由于每篇文章的字数限制,不得不割开发,见谅!)
'----------------------------------------------------------------------
' 辅助方法
'----------------------------------------------------------------------
Private ReadOnly Property DataGridTableGridLineWidth() As Integer
Get
If Me.DataGridTableStyle.GridLineStyle = DataGridLineStyle.Solid Then
Return 1
Else
Return 0
End If
End Get
End Property
Private Sub EndEdit()
InEdit = False
Invalidate()
End Sub
Private Function GetText(ByVal Value As Object) As String
If Value Is System.DBNull.Value Then Return NullText
If Not Value Is Nothing Then
Return Value.ToString
Else
Return String.Empty
End If
End Function
Private Sub HideComboBox() ‘隐藏Combobox
If Combo.Focused Then
Me.DataGridTableStyle.DataGrid.Focus()
End If
Combo.Visible = False
End Sub
Private Sub RollBack()
Combo.Text = OldVal
End Sub
Private Sub PaintText(ByVal g As Graphics, _
ByVal Bounds As Rectangle, _
ByVal Text As String, _
ByVal AlignToRight As Boolean)
Dim BackBrush As
Brush = New SolidBrush(Me.DataGridTableStyle.BackColor)
Dim ForeBrush As
Brush = New SolidBrush(Me.DataGridTableStyle.ForeColor)
PaintText(g, Bounds, Text, BackBrush, ForeBrush, AlignToRight)
End Sub
Private Sub PaintText(ByVal g As Graphics, _
ByVal TextBounds As Rectangle, _
ByVal Text As String, _
ByVal BackBrush As
Brush, _
ByVal ForeBrush As
Brush, _
ByVal AlignToRight As Boolean)
Dim Rect As Rectangle = TextBounds
Dim RectF As RectangleF = RectF.op_Implicit(Rect) ' 转为RectangleF类型
Dim Format As StringFormat = New StringFormat()
If AlignToRight Then
Format.FormatFlags = StringFormatFlags.DirectionRightToLeft
End If
Select Case Me.Alignment
Case Is = HorizontalAlignment.Left
Format.Alignment = StringAlignment.Near
Case Is = HorizontalAlignment.Right
Format.Alignment = StringAlignment.Far
Case Is = HorizontalAlignment.Center
Format.Alignment = StringAlignment.Center
End Select
Format.FormatFlags = Format.FormatFlags Or StringFormatFlags.NoWrap
g.FillRectangle(Brush:=BackBrush, Rect:=Rect)
Rect.Offset(0, yMargin)
Rect.Height -= yMargin
g.DrawString(Text, Me.DataGridTableStyle.DataGrid.Font, ForeBrush, RectF, Format)
Format.Dispose()
End Sub
End Class
4. 类的使用
如何使用这个类呢?方法其实很简单,把它看成与DataGridTextBoxColumn或DataGridBoolColumn一样处理就行了。见下例:数据库名为Northwind.mdb
Private Sub FrmDropDownColumn_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objCustomerCM As CurrencyManager
Dim objCustomerTableStyle As DataGridTableStyle
Dim objGridCol As DataGridColumnStyle
Dim IntAvgCharWidth As Integer
' 新建一个DataSet对象
_CustomerDS = New DataSet()
'新建一个DataTable对象
_StatesDT = New DataTable()
'新建一个 DataGridTableStyle 对象
GridTableStyle = New DataGridTableStyle()
'计算显示时平均每个字符的宽度
With Graphics.FromHwnd(Me.Handle).MeasureString(Text:="ABCDEFGHIJKLMNOPQRSTUVWXYZ", Font:=Me.Font)
IntAvgCharWidth = CInt(.Width / 26!)
End With
' 建立与数据库的连接
_DB = New OleDbConnection()
Try
With _DB
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\Northwind.mdb"
.Open()
End With
Catch dbError As OleDbException
Stop
End Try
_DB.Close()
'
'新生成一条SQL语句且在DataSet中新建一个用户表
StrSQL = "SELECT * FROM 客户 WHERE 国家=" & Chr(34) & "美国" & Chr(34) & " ORDER BY 客户ID ASC"
Try
With New OleDbDataAdapter(selectCommand:=New OleDbCommand(cmdText:=StrSQL, _
Connection:=_DB))
.Fill(dataSet:=_CustomerDS, srcTable:="Customers")
.Dispose()
End With
Catch dbError As OleDbException
Stop
End Try
' 同与下拉框内容相关的数据源进行连接
_DB = New OleDbConnection()
Try
With _DB
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\Northwind.mdb"
.Open()
End With
Catch dbError As OleDbException
Stop
End Try
_DB.Close()
' 创建SQL语句
StrSQL = "SELECT * FROM States ORDER BY 国家名 ASC"
Try
With New OleDbDataAdapter(selectCommand:=New OleDbCommand(cmdText:=StrSQL, _
Connection:=_DB))
.Fill(dataSet:=_CustomerDS, srcTable:="国家")
.Dispose()
End With
Catch dbError As OleDbException
Stop
End Try
With _CustomerDS.Tables
objCustomerCM = CType(Me.BindingContext(.Item(Name:="Customers")), CurrencyManager)
End With
'生成显示信息
With GridTableStyle
.MappingName = "Customers"
With .GridColumnStyles
.Add(column:=New DataGridTextBoxColumn(objCustomerCM. _
GetItemProperties.Item(Name:="地址")))
With .Item(index:=0)
.MappingName = "地址"
.HeaderText = "地址"
.Alignment = HorizontalAlignment.Left
.Width = IntAvgCharWidth * 20
.NullText = String.Empty
End With
_StatesDT = _CustomerDS.Tables.Item("国家")
.Add(column:=New DataGridComboBoxColumn(DataSource:=_StatesDT, _
DisplayMember:=0, _
ValueMember:=0))
With .Item(index:=1)
.MappingName = "国家"
.HeaderText = "国家"
.Alignment = HorizontalAlignment.Left
.Width = IntAvgCharWidth * 10
.NullText = String.Empty
End With
.Add(column:=New DataGridTextBoxColumn(objCustomerCM. _
GetItemProperties.Item(Name:="城市")))
With .Item(index:=2)
.MappingName = "城市"
.HeaderText = "城市"
.Alignment = HorizontalAlignment.Left
.Width = IntAvgCharWidth * 20
.NullText = String.Empty
End With
End With
End With
With EntryGrid
.CaptionText = String.Empty
.DataSource = _CustomerDS
.DataMember = "Customers"
.TableStyles.Add(table:=GridTableStyle)
End With
End Sub
致谢:本程序参考了网上的多个实现方案,在此向各位原作者表示感谢。
----
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。