按鈕列的應用。(在datagrid中加入按鈕列,winforms)

來源:互聯網
上載者:User
datagrid|按鈕 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 

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。