您的位置:首页 > 移动开发 > Objective-C

按钮列的应用。(在datagrid中加入按钮列,winforms)

2007-05-18 17:51 417 查看
Public Class mybuttondatagridtablestyle1
 

    Inherits System.Windows.Forms.DataGridTextBoxColumn
 

 

#Region " Windows 窗体设计器生成的代码 "
 

 

    Public Sub New()
 

        MyBase.New()
 

 

        '该调用是 Windows 窗体设计器所必需的。
 

        InitializeComponent()
 

 

        '在 InitializeComponent() 调用之后添加任何初始化
 

 

    End Sub
 

 

    'UserControl 重写 dispose 以清理组件列表。
 

    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
 

 

    '注意:以下过程是 Windows 窗体设计器所必需的
 

    '可以使用 Windows 窗体设计器修改此过程。
 

    '不要使用代码编辑器修改它。
 

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
 

        components = New System.ComponentModel.Container()
 

    End Sub
 

 

#End Region
 

    Public Delegate Sub DataGridCellButtonClickEventHandler(ByVal sender As Object, ByVal e As DataGridCellButtonClickEventArgs)
 

    Public Event CellButtonClicked As DataGridCellButtonClickEventHandler
 

 

    Private m_Face As Bitmap
 

    Private m_FacePressed As Bitmap
 

    Private m_columnNum As Integer
 

    Private m_Row As Integer
 

 

 

    Public Sub New(ByVal colNum As Integer)
 

        m_columnNum = colNum
 

        m_Row = -1
 

 

        Try
 

            Dim strm As System.IO.Stream = Me.GetType().Assembly.GetManifestResourceStream("btnface.bmp")
 

            m_Face = New Bitmap(strm)
 

            strm = Me.GetType().Assembly.GetManifestResourceStream("btnpressed.bmp")
 

            m_FacePressed = New Bitmap(strm)
 

        Catch
 

        End Try
 

    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)
 

 

    End Sub
 

 

  
 

 

    Public Sub HandleMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
 

        Dim dg As DataGrid = Me.DataGridTableStyle.DataGrid
 

        Dim hti As DataGrid.HitTestInfo = dg.HitTest(New Point(e.X, e.Y))
 

        Dim isClickInCell As Boolean = hti.Column = Me.m_columnNum
 

 

        m_Row = -1
 

 

        Dim rect As New Rectangle(0, 0, 0, 0)
 

 

        If isClickInCell Then
 

            rect = dg.GetCellBounds(hti.Row, hti.Column)
 

            isClickInCell = e.X > rect.Right - Me.m_Face.Width
 

        End If
 

        If isClickInCell Then
 

            Dim g As Graphics = Graphics.FromHwnd(dg.Handle)
 

            g.DrawImage(Me.m_Face, rect.Right - Me.m_Face.Width, rect.Y)
 

            g.Dispose()
 

 

            RaiseEvent CellButtonClicked(Me, New DataGridCellButtonClickEventArgs(hti.Row, hti.Column))
 

 

        End If
 

    End Sub
 

 

    Public Sub HandleMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
 

        Dim dg As DataGrid = Me.DataGridTableStyle.DataGrid
 

        Dim hti As DataGrid.HitTestInfo = dg.HitTest(New Point(e.X, e.Y))
 

        Dim isClickInCell As Boolean = hti.Column = Me.m_columnNum
 

        Dim rect As New Rectangle(0, 0, 0, 0)
 

        If isClickInCell Then
 

            rect = dg.GetCellBounds(hti.Row, hti.Column)
 

            isClickInCell = e.X > rect.Right - Me.m_Face.Width
 

        End If
 

 

        If isClickInCell Then
 

 

            Dim g As Graphics = Graphics.FromHwnd(dg.Handle)
 

            g.DrawImage(Me.m_FacePressed, rect.Right - Me.m_FacePressed.Width, rect.Y)
 

            g.Dispose()
 

            m_Row = hti.Row
 

        End If
 

    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 System.Drawing.Brush, ByVal foreBrush As System.Drawing.Brush, ByVal alignToRight As Boolean)
 

 

        Dim parent As DataGrid = Me.DataGridTableStyle.DataGrid
 

        '如果该行是选中行 或者 当前单元格的行号=点击行的行号并且当前单元格的列号等于NEW的列号参数
 

        Dim current As Boolean = parent.IsSelected(rowNum) Or (parent.CurrentRowIndex = rowNum And parent.CurrentCell.ColumnNumber = Me.m_columnNum)
 

 

        Dim BackColor As Color
 

        If current Then BackColor = parent.SelectionBackColor Else BackColor = parent.BackColor
 

        Dim ForeColor As Color
 

        If current Then ForeColor = parent.SelectionForeColor Else ForeColor = parent.ForeColor
 

 

        '请空单元格
 

        g.FillRectangle(New SolidBrush(BackColor), bounds)
 

 

        ' 绘制值
 

        Dim s As String = Me.GetColumnValueAtRow([source], rowNum).ToString() 'parent[rowNum, 0].ToString() + ((parent[rowNum, 1].ToString())+ "  ").Substring(0,2);
 

      
 

        g.DrawString(s, parent.Font, New SolidBrush(ForeColor), bounds.X, bounds.Y)
 

 

 

        Dim bm As Bitmap
 

        If m_Row = rowNum Then bm = Me.m_FacePressed Else bm = Me.m_Face
 

        g.DrawImage(bm, bounds.Right - bm.Width, bounds.Y)
 

    End Sub
 

End Class
 

 

 

 

调用代码:
 

 

Private Function getdatagridstyle(ByVal table As DataTable) As DataGridTableStyle
 

        Dim style As New DataGridTableStyle()
 

        style.MappingName = table.TableName
 

        style.RowHeaderWidth = 15
 

        Dim i As Integer
 

        For i = 0 To table.Columns.Count - 1
 

            If i = 1 Then
 

                Dim textButtonColStyle As New mybuttondatagridtablestyle1(i) 'pass the column#
 

                textButtonColStyle.HeaderText = table.Columns(i).ColumnName
 

                textButtonColStyle.MappingName = table.Columns(i).ColumnName
 

 

                'hookup our cellbutton handler...
 

                AddHandler textButtonColStyle.CellButtonClicked, AddressOf HandleCellButtonClick
 

 

                style.GridColumnStyles.Add(textButtonColStyle)
 

 

                'hook the mouse handlers
 

                AddHandler DataGrid1.MouseDown, AddressOf textButtonColStyle.HandleMouseDown
 

                AddHandler DataGrid1.MouseUp, AddressOf textButtonColStyle.HandleMouseUp
 

            Else
 

                Dim c As New DataGridTextBoxColumn()
 

                c.HeaderText = table.Columns(i).ColumnName
 

                c.MappingName = table.Columns(i).ColumnName
 

                style.GridColumnStyles.Add(c)
 

            End If
 

        Next
 

        Return style
 

    End Function
 

    Private Sub HandleCellButtonClick(ByVal sender As Object, ByVal e As DataGridCellButtonClickEventArgs)
 

        MessageBox.Show(("row " + e.RowIndex.ToString() + "  col " + e.ColIndex.ToString() + " clicked."))
 

    End Sub
 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息