按钮列的应用。(在datagrid中加入按钮列,winforms)
发表于:2007-06-30来源:作者:点击数:
标签:
PublicClassmybuttondatagridtablestyle1 InheritsSystem. Windows .Forms.DataGridTextBoxColumn #RegionWindows窗体设计器生成的代码 PublicSubNew() MyBase.New() @#该调用是Windows窗体设计器所必需的。 InitializeComponent() @#在InitializeComponent()
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.De
buggerStepThrough()> 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 inst
antText 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 ge
tdatagridstyle(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
原文转自:http://www.ltesting.net