动态网站制作指南



当前位置 > 网站建设学院 > 网络编程 > C#教程 Rss
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket

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


发表日期:2005-8-7


最近谈论较多的就是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。说明:
其他控件的加入原理基本一样,这里就不重复了

关注此文的读者还看过:
·2012-5-17 13:13:45 C# 操作EXCEL(C#中的数据导出EXCEL)
·2012-5-17 13:10:52 C# 中的类型转换
·2012-5-17 13:08:33 C#语言初级入门(1)
·2012-5-17 13:00:05 C#基础全接触
·2012-5-17 12:53:00 c#邮件的代码
·2012-5-17 12:51:44 C#多线程编程简述
·2012-5-17 12:50:50 C#语法糖(Csharp Syntactic sugar)大汇总
·2012-5-17 12:45:41 你必须知道的C#的25个基础概念(附演示)
·2012-5-17 12:41:59 C#提取汉字首字母
站长推荐 PS笔刷下载 在线翻译 系统进程 广告代码
  发表评论
姓 名: 验证码:
内 容:
教程搜索服务
项目外包信息
·UI界面设计
·产品外观改版设计 15000元
·照明灯具网站设计 10000元
·求长期合作网站设计制作高手
·做B2C网站 20000元
·Android或QT软硬件平台设计(工
·网站首页FLASH
·网站PSD稿设计
·企业网站整站网页设计(美观大气
·网站页面设计及套入程序
·UI界面设计
·产品外观改版设计 15000元
·照明灯具网站设计 10000元
·求长期合作网站设计制作高手
·PPT设计
发布信息 浏览信息
邮件订阅服务
输入你的邮件地址,你将不会错过任何关于<C#教程>的内容


网络编程文章分类
ASP教程
ASP实例
ASP技巧
ASP文摘
PHP教程
PHP技巧
PHP实例
PHP文摘
JSP教程
JSP技巧
JSP实例
JSP文摘
ASP.NET教程
ASP.NET技巧
ASP.NET实例
ASP.NET应用
xml教程
xsl教程
xml技巧
C#教程
C#应用
Delphi教程
Perl教程
Shell教程
Ajax教程
Visual Basic教程
Java教程
J2EE/J2ME教程
C/C++教程
移动解决方案
移动短信技术
移动行业动态
软件工程
WordPress
Android开发
站长工具:Google PR查询|Alexa排名查询|网站速度测试|CSS在线编辑器|OPEN参数生成器|弹出式窗口代码产生器|密码登录生成器|在线按钮生成器|Meta标签生成器|邮箱图标在线生成|多色彩特效字代码生成器|网页代码调试器|在线FTP登陆|Flash取色器|配色代码对照表|配色辞典|CSS生成器|CSS在线压缩|广告代码|框架网页代码生成器|js/vbs加密|md5加密|进制转换|UTF-8 转换工具|在线调色板|Html转换js|Html转换asp|Html转换php|Html转换perl
实用工具:汉字翻译拼音|拼音字典|在线翻译|天气预报|火星文|在线网速测试|符号对照表|个税计算|理财工具|黄金价格|购房银行按揭利率计算|汇率查询|经典小工具|汉字简繁转换|普通单位换算|公制单位换算|生辰老黄历|国内电话区号|国家代码与域名缩写|文字加密解密|元素周期表|健康查询|世界时间|全国各地车牌查询|全国车辆交通违章查询|万年历|二十四节气|汉字横竖排版|手机号码查询|计算器|ip搜索|酒店预订|机票预订
广告刊登 | 版权声明 | 联系我们 | 加入收藏 | RSS订阅
Copyright © 2000-2012 www.knowsky.com All rights reserved | 沪ICP备05001343号