龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

datagridcolumnstyle重写,实现插入不同控件列体验

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
最近谈论较多的就是Datagrid,非凡新手最是郁闷为何没有更好的控件,来满足自已的需求。 其实通过重写可以达到很多不同的功能体验,在这里我们仅仅讨论关于datagridcolumnstyle重写的问

最近谈论较多的就是Datagrid,非凡新手最是郁闷为何没有更好的控件,来满足自已的需求。

  其实通过重写可以达到很多不同的功能体验,在这里我们仅仅讨论关于datagridcolumnstyle重写的问题

  ==========================================

  Power by: landlordh

  Datatime: 2005-08-04

  转载请注明出处,谢谢

  ==========================================

  1。重写TextBox:

Public Class XP_TextBox

   Inherits System.Windows.Forms.TextBox

  #Region " Windows "

Public Sub New()

   MyBase.New()

InitializeComponent()

   End Sub

   Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

   If disposing Then

   If Not (components Is Nothing) Then

   components.Dispose()

   End If

   End If

   MyBase.Dispose(disposing)

   End Sub

'Windows

   Private components As System.ComponentModel.IContainer

   Private Sub InitializeComponent()

   '

   'TextBox

   '

   Me.EnableContextMenu = True

   Me.EnablePaste = True

   Me.Name = "TextBox"

End Sub

#End Region

#Region " Variables "

Private m_EnPaste As Boolean = True

   Private m_EnContextMenu As Boolean = True

#End Region

#Region " Property "

Property EnablePaste() As Boolean

   Get

   Return m_EnPaste

   End Get

   Set(ByVal Value As Boolean)

   m_EnPaste = Value

   Me.Invalidate()

   End Set

   End Property

Property EnableContextMenu() As Boolean

   Get

   Return m_EnContextMenu

   End Get

  

  

Set(ByVal Value As Boolean)

   m_EnContextMenu = Value

   Me.Invalidate()

   End Set

   End Property

#End Region

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

   Select Case m.Msg

   Case &H302 'paste

   RaiseEvent PasteEvent()

   If Not m_EnPaste Then Return

   Case &H7B 'contextmenu

   If Not m_EnContextMenu Then Return

   End Select

   MyBase.WndProc(m)

   End Sub

Public Event PasteEvent()

End Class

2。重写datagridcolumnstyle(重点介绍内容):

Imports System.Drawing

  Imports System.Windows.Forms

Public NotInheritable Class DataGridTextBoxColumnStyle

   Inherits System.Windows.Forms.DataGridColumnStyle

#Region "Declare Property"

Private WithEvents m_TextBox As New Landlord.Component.XP_TextBox

   Private IsEditing As Boolean

   Private EditingRow As Integer = -1

   Private m_oldvalue As String

#End Region

#Region " windows "

Sub New()

   Me.m_TextBox.Visible = False

   End Sub

Public Sub New(ByVal Container As System.ComponentModel.IContainer)

   MyClass.New()

Container.Add(Me)

   End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

   If disposing Then

   If Not (components Is Nothing) Then

   components.Dispose()

   End If

   End If

   MyBase.Dispose(disposing)

   End Sub

Private components As System.ComponentModel.IContainer

Private Sub InitializeComponent()

  

  

components = New System.ComponentModel.Container

   End Sub

#End Region

#Region "Get Function"

Protected Overrides Function GetMinimumHeight() As Integer

   Return m_TextBox.PreferredHeight + 2

   End Function

Protected Overrides Function GetPreferredHeight(ByVal g As System.Drawing.Graphics, ByVal value As Object) As Integer

   Return m_TextBox.PreferredHeight + 2

   End Function

Protected Overrides Function GetPreferredSize(ByVal g As System.Drawing.Graphics, ByVal value As Object) As System.Drawing.Size

   Return New Size(50, m_TextBox.PreferredHeight + 2)

   End Function

#End Region

#Region "Paint"

Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer)

   Paint(g, bounds, [source], rowNum, False)

   End Sub

Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal alignToRight As Boolean)

   Dim brush_for As Brush = New SolidBrush(Me.DataGridTableStyle.ForeColor)

   Dim brush_bak As Brush = New SolidBrush(Me.DataGridTableStyle.BackColor)

   Paint(g, bounds, [source], rowNum, brush_bak, brush_for, alignToRight)

   brush_for.Dispose()

   brush_bak.Dispose()

   End Sub

Protected Overloads Overrides Sub Paint(ByVal g As System.Drawing.Graphics, ByVal bounds As System.Drawing.Rectangle, ByVal [source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal backBrush As Brush, ByVal foreBrush As Brush, ByVal alignToRight As Boolean)

   Dim str As String

   If IsDBNull(GetColumnValueAtRow([source], rowNum)) Then

   str = Me.NullText

   Else

   str = CType(GetColumnValueAtRow([source], rowNum), String)

   End If

   Dim brush As Brush = backBrush

   Dim rect As System.Drawing.Rectangle = bounds

  

  

g.FillRectangle(brush, rect)

   If Me.IsEditing And EditingRow = rowNum Then

   brush = New SolidBrush(Color.White)

   g.FillRectangle(brush, bounds)

   End If

   rect.Offset(0, 2)

   rect.Height -= 2

   brush = New SolidBrush(Me.DataGridTableStyle.ForeColor)

   If Me.DataGridTableStyle.DataGrid.IsSelected(rowNum) Then

   brush = New SolidBrush(Me.DataGridTableStyle.SelectionBackColor)

   Dim rectf As RectangleF = New RectangleF(bounds.X, bounds.Y, bounds.Width, bounds.Height)

   g.FillRectangle(brush, rectf)

   brush = New SolidBrush(Me.DataGridTableStyle.SelectionForeColor)

   End If

   If Me.Alignment = HorizontalAlignment.Center Then

   Dim w As Integer = g.MeasureString(str, Me.DataGridTableStyle.DataGrid.Font, New SizeF(bounds.Width, bounds.Height)).Width

   rect.X = rect.X + (bounds.Width - w) / 2

   ElseIf Me.Alignment = HorizontalAlignment.Right Then

   Dim w As Integer = g.MeasureString(str, Me.DataGridTableStyle.DataGrid.Font, New SizeF(bounds.Width, bounds.Height)).Width

   rect.X = bounds.Right - w

   End If

   g.DrawString(str, Me.DataGridTableStyle.DataGrid.Font, brush, rect.X, rect.Y)

   brush.Dispose()

   End Sub

#End Region

#Region "Overrides Method"

Protected Overrides Function Commit(ByVal dataSource As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As Boolean

   Me.m_TextBox.Bounds = Rectangle.Empty

   If Not Me.IsEditing Then

   Return True

   End If

   EditingRow = -1

   IsEditing = False

  

  

Try

   Dim value As Object

   value = m_TextBox.Text

   If NullText.Equals(value) Then

   value = System.DBNull.Value

   End If

   SetColumnValueAtRow(dataSource, rowNum, value)

   Catch ex As Exception

   Abort(rowNum)

   Return False

   End Try

   invalidate()

   Return True

   End Function

Protected Overrides Sub Abort(ByVal rowNum As Integer)

   Me.m_TextBox.Text = m_oldvalue

EditingRow = -1

If m_TextBox.Focused Then

   Me.DataGridTableStyle.DataGrid.Focus()

   End If

   Me.m_TextBox.Visible = False

Me.IsEditing = False

   Me.Invalidate()

   End Sub

Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)

   EditingRow = rowNum

   IsEditing = True

   Dim value As String

   If IsDBNull(GetColumnValueAtRow(source, rowNum)) Then

   value = Me.NullText

   Else

   value = CType(GetColumnValueAtRow(source, rowNum), String)

   End If

   m_oldvalue = value

   If cellIsVisible Then

   If Not Me.ReadOnly Then

   Me.m_TextBox.Bounds = New Rectangle(bounds.X + 1, bounds.Y + 1, bounds.Width - 2, bounds.Height - 2)

  

  

Me.m_TextBox.Text = value

   Me.m_TextBox.Select()

   Me.m_TextBox.Focus()

   Me.m_TextBox.SelectAll()

   Me.m_TextBox.Visible = True

   Me.m_TextBox.Flat = True

   End If

   Else

   Me.m_TextBox.Text = value

   '滚动时会丢失焦点

   'Me.m_TextBox.Visible = False

   End If

   If Me.m_TextBox.Visible Then

   DataGridTableStyle.DataGrid.Invalidate(bounds)

   End If

   End Sub

Protected Overloads Overrides Sub SetDataGridInColumn(ByVal value As System.Windows.Forms.DataGrid)

   MyBase.SetDataGridInColumn(value)

   If Not m_TextBox.Parent Is Nothing Then

   m_TextBox.Parent.Controls.Remove(Me.m_TextBox)

   End If

   If Not value Is Nothing Then

   value.Controls.Add(Me.m_TextBox)

   End If

   End Sub

Protected Overrides Sub ConcedeFocus()

   EditingRow = -1

   '否则先点到新增行,再回选非新行格时该列最后一行的值变为(null)

   IsEditing = False

   Me.m_TextBox.Visible = False

   invalidate()

   End Sub

Protected Overrides Sub EnterNullValue()

   Me.m_TextBox.Text = Me.NullText

   End Sub

Private Sub m_TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles m_TextBox.KeyPress

   If Not Char.IsControl(e.KeyChar) Then

  

  

Me.IsEditing = True

   MyBase.ColumnStartedEditing(m_TextBox)

   End If

   End Sub

Private Sub m_TextBox_PasteEvent() Handles m_TextBox.PasteEvent

   Me.IsEditing = True

   Me.ColumnStartedEditing(m_TextBox)

   End Sub

#End Region

End Class

3。使用:

  新建一个空窗体,拖入datagrid,窗体load事件中代码如下

  Private idtb_temp As New DataTable

Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

idtb_temp = New DataTable("NameTable")

   idtb_temp.Columns.Add(New DataColumn("normal"))

   idtb_temp.Columns.Add(New DataColumn("textbox1"))

   idtb_temp.Columns.Add(New DataColumn("combobox1"))

   Dim dateColumns As DataColumn

   dateColumns = New DataColumn("datetime1", Type.GetType("System.DateTime"))

   idtb_temp.Columns.Add(dateColumns)

   idtb_temp.Columns.Add(New DataColumn("checkbox1", Type.GetType("System.Boolean")))

Dim idrw_row As DataRow

   Dim i As Integer

   For i = 0 To 20

   idrw_row = idtb_temp.NewRow

   idrw_row.Item("normal") = "names"

   idrw_row.Item("textbox1") = "nick"

   idrw_row.Item("combobox1") = i.ToString

   idrw_row.Item("datetime1") = "2004-06-04"

   idrw_row.Item("checkbox1") = True

   idtb_temp.Rows.Add(idrw_row)

   Next

Me.DataGrid1.DataSource = idtb_temp

Dim myGridStyle As Windows.Forms.DataGridTableStyle = New Windows.Forms.DataGridTableStyle

   myGridStyle.MappingName = "NameTable"

   myGridStyle.PreferredRowHeight = 30

   myGridStyle.SelectionBackColor = Color.Blue

   myGridStyle.BackColor = Color.Yellow

   Dim c1 As Windows.Forms.DataGridTextBoxColumn = New Windows.Forms.DataGridTextBoxColumn

   With c1

   .MappingName = "normal"

   .Width = 100

   .HeaderText = "normal"

   .Alignment = HorizontalAlignment.Center

   End With

   myGridStyle.GridColumnStyles.Add(c1)

Dim c2 As Landlord.Component.DragGrid.DataGridTextBoxColumnStyle = New Landlord.Component.DragGrid.DataGridTextBoxColumnStyle

  

  

With c2

   .MappingName = "textbox1"

   .Width = 100

   .HeaderText = "textbox1"

   End With

   myGridStyle.GridColumnStyles.Add(c2)

Dim c3 As Landlord.Component.DragGrid.DataGridComboBoxColumnStyle = New Landlord.Component.DragGrid.DataGridComboBoxColumnStyle

   With c3

   .MappingName = "combobox1"

   .HeaderText = "combobox1"

   .Width = 100

   .AddItem("111")

   .AddItem("222")

   .Alignment = HorizontalAlignment.Center

   End With

   myGridStyle.GridColumnStyles.Add(c3)

Dim c4 As Landlord.Component.DragGrid.DataGridDateTimePickerColumnStyle = New Landlord.Component.DragGrid.DataGridDateTimePickerColumnStyle

   With c4

   .MappingName = "datetime1"

   .HeaderText = "datetime1"

   .Width = "100"

   .Alignment = HorizontalAlignment.Center

   End With

   myGridStyle.GridColumnStyles.Add(c4)

Dim c5 As Landlord.Component.DragGrid.DataGridCheckBoxColumnStyle = New Landlord.Component.DragGrid.DataGridCheckBoxColumnStyle

   With c5

   .MappingName = "checkbox1"

   .HeaderText = "checkbox1"

   .Width = 100

   .TrueColor = Color.Red

   End With

   myGridStyle.GridColumnStyles.Add(c5)

Me.DataGrid1.TableStyles.Clear()

   Me.DataGrid1.TableStyles.Add(myGridStyle)

End Sub

4。说明:

  其他控件的加入原理基本一样,这里就不重复了

  

精彩图集

赞助商链接