WEB开发网
开发学院软件开发C++ datagridcolumnstyle重写,实现插入不同控件列体验... 阅读

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

 2008-03-08 11:05:34 来源:WEB开发网   
核心提示:最近谈论较多的就是Datagrid,非凡新手最是郁闷为何没有更好的控件,datagridcolumnstyle重写,实现插入不同控件列体验,来满足自已的需求,其实通过重写可以达到很多不同的功能体验,拖入datagrid,窗体load事件中代码如下Private idtb_temp As New DataTablePri
最近谈论较多的就是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
   <System.Diagnostics.DebuggerStepThrough()> 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    <System.Diagnostics.DebuggerStepThrough()> 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。说明:
其他控件的加入原理基本一样,这里就不重复了

Tags:datagridcolumnstyle 重写 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接