Imports System Imports System.Drawing Imports System.Windows.Forms Imports System.Windows.Forms.VisualStyles Class Form1 Inherits Form Private WithEvents dataGridView1 As New DataGridView() <STAThread()> _ Public Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub Public Sub New() Me.AutoSize = True End Sub Public Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load Dim column0 As New DataGridViewCheckBoxColumn() Dim column1 As New DataGridViewDisableButtonColumn() column0.Name = "CheckBoxes" column1.Name = "Buttons" dataGridView1.Columns.Add(column0) dataGridView1.Columns.Add(column1) dataGridView1.RowCount = 8 dataGridView1.AutoSize = True dataGridView1.AllowUserToAddRows = False dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = _ DataGridViewContentAlignment.MiddleCenter ' Set the text for each button. Dim i As Integer For i = 0 To dataGridView1.RowCount - 1 dataGridView1.Rows(i).Cells("Buttons").Value = _ "Button " + i.ToString() Next i Me.Controls.Add(dataGridView1) End Sub ' This event handler manually raises the CellValueChanged event ' by calling the CommitEdit method. Sub dataGridView1_CurrentCellDirtyStateChanged( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles dataGridView1.CurrentCellDirtyStateChanged If dataGridView1.IsCurrentCellDirty Then dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) End If End Sub ' If a check box cell is clicked, this event handler disables ' or enables the button in the same row as the clicked cell. Public Sub dataGridView1_CellValueChanged(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles dataGridView1.CellValueChanged If dataGridView1.Columns(e.ColumnIndex).Name = "CheckBoxes" Then Dim buttonCell As DataGridViewDisableButtonCell = _ CType(dataGridView1.Rows(e.RowIndex).Cells("Buttons"), _ DataGridViewDisableButtonCell) Dim checkCell As DataGridViewCheckBoxCell = _ CType(dataGridView1.Rows(e.RowIndex).Cells("CheckBoxes"), _ DataGridViewCheckBoxCell) buttonCell.Enabled = Not CType(checkCell.Value, [Boolean]) dataGridView1.Invalidate() End If End Sub ' If the user clicks on an enabled button cell, this event handler ' reports that the button is enabled. Sub dataGridView1_CellClick(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles dataGridView1.CellClick If dataGridView1.Columns(e.ColumnIndex).Name = "Buttons" Then Dim buttonCell As DataGridViewDisableButtonCell = _ CType(dataGridView1.Rows(e.RowIndex).Cells("Buttons"), _ DataGridViewDisableButtonCell) If buttonCell.Enabled Then MsgBox(dataGridView1.Rows(e.RowIndex). _ Cells(e.ColumnIndex).Value.ToString() + _ " is enabled") End If End If End Sub End Class Public Class DataGridViewDisableButtonColumn Inherits DataGridViewButtonColumn Public Sub New() Me.CellTemplate = New DataGridViewDisableButtonCell() End Sub End Class Public Class DataGridViewDisableButtonCell Inherits DataGridViewButtonCell Private enabledValue As Boolean Public Property Enabled() As Boolean Get Return enabledValue End Get Set(ByVal value As Boolean) enabledValue = value End Set End Property ' Override the Clone method so that the Enabled property is copied. Public Overrides Function Clone() As Object Dim Cell As DataGridViewDisableButtonCell = _ CType(MyBase.Clone(), DataGridViewDisableButtonCell) Cell.Enabled = Me.Enabled Return Cell End Function ' By default, enable the button cell. Public Sub New() Me.enabledValue = True End Sub Protected Overrides Sub Paint(ByVal graphics As Graphics, _ ByVal clipBounds As Rectangle, ByVal cellBounds As Rectangle, _ ByVal rowIndex As Integer, _ ByVal elementState As DataGridViewElementStates, _ ByVal value As Object, ByVal formattedValue As Object, _ ByVal errorText As String, _ ByVal cellStyle As DataGridViewCellStyle, _ ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _ ByVal paintParts As DataGridViewPaintParts) ' The button cell is disabled, so paint the border, ' background, and disabled button for the cell. If Not Me.enabledValue Then ' Draw the background of the cell, if specified. If (paintParts And DataGridViewPaintParts.Background) = _ DataGridViewPaintParts.Background Then Dim cellBackground As New SolidBrush(cellStyle.BackColor) graphics.FillRectangle(cellBackground, cellBounds) cellBackground.Dispose() End If ' Draw the cell borders, if specified. If (paintParts And DataGridViewPaintParts.Border) = _ DataGridViewPaintParts.Border Then PaintBorder(graphics, clipBounds, cellBounds, cellStyle, _ advancedBorderStyle) End If ' Calculate the area in which to draw the button. Dim buttonArea As Rectangle = cellBounds Dim buttonAdjustment As Rectangle = _ Me.BorderWidths(advancedBorderStyle) buttonArea.X += buttonAdjustment.X buttonArea.Y += buttonAdjustment.Y buttonArea.Height -= buttonAdjustment.Height buttonArea.Width -= buttonAdjustment.Width ' Draw the disabled button. ButtonRenderer.DrawButton(graphics, buttonArea, _ PushButtonState.Disabled) ' Draw the disabled button text. If TypeOf Me.FormattedValue Is String Then TextRenderer.DrawText(graphics, CStr(Me.FormattedValue), _ Me.DataGridView.Font, buttonArea, SystemColors.GrayText) End If Else ' The button cell is enabled, so let the base class ' handle the painting. MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, _ elementState, value, formattedValue, errorText, _ cellStyle, advancedBorderStyle, paintParts) End If End Sub End Class