一个通用的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
mColWidth = mGraphics.MeasureString(New String(CType("A", Char), MaxWidth), m_DataGrid.Font).Width + 2
Return CType(mColWidth, Integer)
End Function
'//在某列后添加一列
Public Sub AddColumn(ByVal PosColumnName As String, ByVal ColumnName As String)
If m_DataGridTableStyle Is Nothing Then Exit Sub
If Not m_DataTable.Columns.Contains(PosColumnName) Then Exit Sub
If m_DataTable.Columns.Contains(ColumnName) Then Exit Sub
Dim tmpStyle As New DataGridTableStyle
For Each mColumnStyle As DataGridColumnStyle In m_DataGridTableStyle.GridColumnStyles
tmpStyle.GridColumnStyles.Add(mColumnStyle)
If mColumnStyle.HeaderText.Equals(PosColumnName) Then
Dim tmpTextColumn As New DataGridTextBoxColumn
m_DataTable.Columns.Add(ColumnName)
tmpTextColumn.HeaderText = ColumnName
tmpTextColumn.MappingName = ColumnName
tmpStyle.GridColumnStyles.Add(tmpTextColumn)
End If
Next
m_DataGrid.TableStyles.Clear()
tmpStyle.MappingName = m_DataGridTableStyle.MappingName
m_DataGridTableStyle = tmpStyle
m_DataGrid.TableStyles.Add(m_DataGridTableStyle)
End Sub
'//不显示NULL
Public WriteOnly Property NotShowNull() As Boolean
Set(ByVal Value As Boolean)
For Each mColumnStyle As DataGridColumnStyle In m_DataGridTableStyle.GridColumnStyles
If Value Then
mColumnStyle.NullText = ""
Else
mColumnStyle.NullText = "(NULL)"
End If
Next
End Set
End Property
'//如果是日期类型,显示时间
Public WriteOnly Property ShowTimeFormat() As Boolean
Set(ByVal Value As Boolean)
For Each mColumnStyle As DataGridColumnStyle In m_DataGridTableStyle.GridColumnStyles
If Not mColumnStyle.MappingName = "" AndAlso m_DataTable.Columns(mColumnStyle.MappingName).DataType.Name.IndexOf("Date") <> -1 Then
If Value Then
CType(mColumnStyle, DataGridTextBoxColumn).Format = "yyyy-MM-dd hh:mm:ss"
Else
CType(mColumnStyle, DataGridTextBoxColumn).Format = "yyyy-MM-dd"
End If
End If
Next
End Set
End Property
'个别编辑,除逻辑类型外
Public ReadOnly Property TextColumnStyle(ByVal ColumnName As String) As DataGridTextBoxColumn
Get
If Not m_DataTable.Columns(ColumnName) Is Nothing AndAlso Not m_DataTable.Columns(ColumnName).DataType.Name.Equals("Boolean") Then
Return CType(m_DataGridTableStyle.GridColumnStyles(ColumnName), DataGridTextBoxColumn)
Else
Return Nothing
End If
End Get
End Property
End Class
'测试
Dim myTableStyle As New TableStyle
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ds As New DataSet
Me.SqlConnection1.Open()
Me.SqlDataAdapter1.Fill(ds)
Me.SqlConnection1.Close()
Me.DataGrid1.DataSource = ds.Tables(0)
AddHandler myTableStyle.GridTextBoxDoubleClickEvent, AddressOf
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
With myTableStyle
.DataGrid = Me.DataGrid1
.Initialize()
End With
Me.DataGridTextColumn_DoubleClick
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
myTableStyle.NotShowNull = True
myTableStyle.ShowTimeFormat = True
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
myTableStyle.NotShowNull = False
myTableStyle.ShowTimeFormat = False
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
myTableStyle.DataGridTableStyle.GridColumnStyles(2).ReadOnly = True
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
myTableStyle.AddColumn("姓名", "Hello")
myTableStyle.AutoExtend()
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
myTableStyle.TextColumnStyle("姓名").Width=0
End Sub
Private Sub DataGridTextColumn_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim mTextBox As TextBox = CType(sender, TextBox)
mTextBox.BackColor = System.Drawing.Color.Blue
MsgBox(mTextBox.Text)
End Sub
本文地址:http://com.8s8s.com/it/it42945.htm