亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

datagridcolumnstyle重寫,實現插入不同控件列體驗

2019-11-18 19:14:24
字體:
來源:轉載
供稿:網友

最近談論較多的就是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。說明:
其他控件的加入原理基本一樣,這里就不重復了


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美福利在线观看| 亚洲成人激情视频| 欧美丝袜一区二区| 欧美福利视频在线| 91久久久亚洲精品| 国产精品高潮呻吟久久av黑人| 国产精品第一第二| 亚洲国模精品私拍| 在线日韩第一页| 日韩一级裸体免费视频| 国产a∨精品一区二区三区不卡| 久久精品国产久精国产一老狼| 亚洲色图美腿丝袜| 成人性生交大片免费观看嘿嘿视频| 欧美性猛交xxxx富婆弯腰| 欧美日韩成人网| 蜜臀久久99精品久久久久久宅男| 国产网站欧美日韩免费精品在线观看| 91久久综合亚洲鲁鲁五月天| 欧美国产极速在线| 91精品在线国产| 日韩欧美在线观看视频| 亚洲伊人久久大香线蕉av| 久久久99久久精品女同性| 7777精品视频| 亚洲欧美国产高清va在线播| 美女福利精品视频| 成人精品一区二区三区电影黑人| 97欧美精品一区二区三区| 黄色成人av在线| 亚洲国产日韩欧美综合久久| 九九热精品视频在线播放| 国产精品91在线观看| 欧美高跟鞋交xxxxhd| 91久久中文字幕| 欧美激情精品久久久久久| 国产成人精品综合久久久| 一区二区三区 在线观看视| 亚洲黄色在线看| 亚洲香蕉成人av网站在线观看| 亚洲天堂av在线播放| 亚洲欧美视频在线| 91久久精品国产91久久性色| 日韩精品免费一线在线观看| 日本成熟性欧美| 午夜精品一区二区三区在线播放| 日韩av最新在线| 久久视频在线免费观看| 久久久99久久精品女同性| 国产精品99久久久久久人| 国产精品扒开腿做爽爽爽男男| 亚洲级视频在线观看免费1级| 亚洲女同性videos| 欧美性少妇18aaaa视频| 亚洲国产精品成人一区二区| 日韩av在线一区二区| 日韩中文字幕精品视频| 一区二区三区视频观看| 欧美激情一区二区三区成人| 91久久久久久久久久| 成人国产精品一区二区| 日韩视频永久免费观看| 91精品久久久久久久久| 亚洲欧洲一区二区三区在线观看| 欧美激情乱人伦一区| 2019亚洲日韩新视频| 中文字幕日韩视频| 久久91精品国产| 国产成人一区二区三区小说| 亚洲国产精品va在线看黑人| 久久男人av资源网站| 最近2019免费中文字幕视频三| 欧美在线中文字幕| 色综合久久88色综合天天看泰| 播播国产欧美激情| 日韩av综合中文字幕| 亚洲精品国产综合区久久久久久久| 欧美一级高清免费播放| 国产精品福利在线观看网址| 国产999在线| 日韩av手机在线| 国产精品毛片a∨一区二区三区|国| 日韩欧美aⅴ综合网站发布| 久久精品亚洲国产| 亚洲日韩中文字幕在线播放| 国产精品老牛影院在线观看| 美女啪啪无遮挡免费久久网站| 91精品国产高清自在线看超| 久久免费在线观看| 亚洲国产日韩欧美在线99| 日本精品免费观看| 亚洲а∨天堂久久精品9966| 国产精品久久久久久av福利| 91精品国产电影| 国产精品专区一| 欧美黄色www| 久久国产精品久久久| 日韩久久精品成人| 日韩中文在线视频| 亚洲欧美在线一区二区| 国外成人在线播放| 亚洲一区久久久| 日韩精品久久久久久福利| 欧美日韩另类在线| 5566日本婷婷色中文字幕97| 成人免费福利在线| 4438全国亚洲精品在线观看视频| 国产精品久久久久91| 欧美一区二区三区免费观看| 97人人做人人爱| 在线成人免费网站| 97色在线视频观看| 国产精品永久在线| 国产精品久久久久久久久久免费| 日本免费在线精品| 亚洲天堂一区二区三区| 亚洲成人激情在线| 国产成人久久久| 九九精品在线观看| 亚洲免费一级电影| 亚洲xxxxx| 欧美性xxxx极品高清hd直播| 亚洲老头同性xxxxx| 久久男人的天堂| 欧美日韩福利视频| 欧美性xxxx在线播放| 国内精品中文字幕| 成人免费直播live| 日韩电影免费在线观看中文字幕| 成人久久一区二区三区| 久久久久国产精品免费| 欧美与黑人午夜性猛交久久久| 国产精品三级久久久久久电影| 97色在线观看免费视频| 午夜精品视频在线| 欧美激情综合色综合啪啪五月| 青青草原成人在线视频| 国产成人自拍视频在线观看| 国产精品视频在线观看| 日韩精品中文字幕在线播放| 日本精品久久久久影院| 国产一区二区三区精品久久久| 欧美黑人狂野猛交老妇| 91成人性视频| 在线精品视频视频中文字幕| 狠狠色狠狠色综合日日五| 中文字幕亚洲无线码在线一区| 欧美黄色片免费观看| 日韩在线视频二区| 亚洲视频在线看| 日韩av在线看| 久久久久久国产三级电影| 久久国内精品一国内精品| 欧美成人剧情片在线观看| 日韩不卡在线观看| 久久久成人av| 国产美女久久久| 69久久夜色精品国产7777| 日韩欧美精品免费在线| 成人欧美一区二区三区黑人| 欧美成人精品影院| 成人激情视频免费在线| 午夜精品久久久久久99热软件| 亚洲欧美国产一区二区三区|