一个通用的 DataGridTableStyle 的做法
哈,这两天都喜欢写“通用”的东西。
这个类,可以实现自适应列宽、只读、时分显示、事件、任意位置加列、单击单元格背景色设置等等,操作简便。只是时间关系(明天要出去一趟),今天没办法完善。仅供参考,你可以加入别的东西。以下只列代码了,不清楚的自己试用查资料就行了。
Public Class TableStyle
Private m_DataGridTableStyle As DataGridTableStyle
Private m_DataGrid As DataGrid
Private m_DataTable As DataTable
'// 添加事件处理,在此只考虑 DataGridTextBoxColumn 双击事件
Public Delegate Sub ClickEventHandler( ByVal sender As Object , ByVal e As System.EventArgs)
Public Event GridTextBoxDoubleClickEvent As ClickEventHandler
Public Sub GridTextBox_DoubleClick( ByVal sender As Object , ByVal e As System.EventArgs)
RaiseEvent GridTextBoxDoubleClickEvent(sender, e)
End Sub
'// 设置 DataGrid
Public Property DataGrid As DataGrid
Get
Return m_DataGrid
End Get
Set ( ByVal Value As DataGrid)
m_DataGrid = Value
End Set
End Property
'// 返回模板
Public ReadOnly Property DataGridTableStyle As DataGridTableStyle
Get
Return m_DataGridTableStyle
End Get
End Property
'// 初始化
Public Sub Initialize()
'// 判断 mDataGrid 数据源类型
'// 如果绑定的是 DataSet 或 DataViewManager 或没有绑定任何数据源,则退出 ,
If TypeOf m_DataGrid.DataSource Is System.Data.DataSet OrElse _
TypeOf m_DataGrid.DataSource Is System.Data.DataViewManager OrElse _
m_DataGrid.DataSource Is Nothing Then Exit Sub
'// 以下分别考虑两种数据源,一是 DataView, 一是 DataTable
If TypeOf m_DataGrid.DataSource Is System.Data.DataView Then
m_DataTable = CType (m_DataGrid.DataSource, DataView).Table
Else
m_DataTable = CType (m_DataGrid.DataSource, DataTable)
End If
m_DataGridTableStyle = New DataGridTableStyle
m_DataGridTableStyle.MappingName = m_DataTable.TableName
'// 加 ColumnStyle
Dim mDataColumn As DataColumn
Dim mColumnStyle As DataGridColumnStyle
For Each mDataColumn In m_DataTable.Columns
Select Case mDataColumn.DataType.Name
Case "Boolean"
mColumnStyle = New DataGridBoolColumn
Case Else
mColumnStyle = New DataGridTextBoxColumn
AddHandler CType (mColumnStyle, DataGridTextBoxColumn).TextBox.DoubleClick, AddressOf GridTextBox_DoubleClick
End Select
'// 绑定到 DataTable 的 Column
With mColumnStyle
.MappingName = mDataColumn.ColumnName
.HeaderText = mDataColumn.ColumnName
End With
'// 加入到 DataGridTableStyle
m_DataGridTableStyle.GridColumnStyles.Add(mColumnStyle)
Next
'// 将 DataGridTableStyle 绑定到 DataGrid
m_DataGrid.TableStyles.Clear()
m_DataGrid.TableStyles.Add(m_DataGridTableStyle)
End Sub
'// 自适应宽度
Public Sub AutoExtend()
If m_DataGridTableStyle Is Nothing Then Exit Sub
' 取各字段的最大字节数,包括字段名和值
Dim mRow As DataRow
Dim mColumn As DataColumn
For Each mColumn In m_DataTable.Columns
m_DataGridTableStyle.GridColumnStyles(mColumn.ColumnName).Width = GetColumnMaxWidth(0, mColumn.ColumnName)
Next
For Each mRow In m_DataTable.Rows
For Each mColumn In m_DataTable.Columns
If Not IsDBNull(mRow(mColumn.ColumnName)) Then
m_DataGridTableStyle.GridColumnStyles(mColumn.ColumnName).Width = _
GetColumnMaxWidth(m_DataGridTableStyle.GridColumnStyles(mColumn.ColumnName).Width, mRow(mColumn.ColumnName).ToString)
End If
Next
Next
' 参照 DataGrid 的 Graphics 赋实际宽度
For Each mColumnStyle As DataGridColumnStyle In m_DataGridTableStyle.GridColumnStyles
mColumnStyle.Width = ColumnWidth(mColumnStyle.Width)
Next
End Sub
Private Function GetColumnMaxWidth( ByVal MaxWidth As Integer , ByVal mString As String ) As Integer
Dim mLength As Integer
mLength = System.Text.Encoding.Default.GetBytes(mString).Length()
If MaxWidth < mLength Then
Return mLength
Else
Return MaxWidth
End If
End Function
Private Function ColumnWidth( ByVal MaxWidth As Integer ) As Integer
Dim mGraphics As Graphics = m_DataGrid.CreateGraphics
Dim mColWidth As Single </