Hi PSowmiya,
The DataGridView control includes the DataGridViewButtonCell class for displaying cells with a user interface like a button.
However DataGridViewButtonCell does not provide a way to disable the appearance of the button displayed by the cell.
So you need to customize the DataGridViewButtonCell class to display buttons that can appear disabled.
Refer following code example, how to customize the the DataGridViewButtonCell class.
Namespaces
C#
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
VB.Net
Imports System.Data
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Code
C#
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
new DataColumn("Name", typeof(string)),
new DataColumn("Country",typeof(string)) });
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(2, "Mudassar Khan", "India");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(4, "Robert Schidner", "Russia");
dataGridView1.AutoGenerateColumns = false;
dataGridView1.ColumnCount = 3;
dataGridView1.AutoSize = false;
dataGridView1.ScrollBars = ScrollBars.Both;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.Columns[0].Name = "Id";
dataGridView1.Columns[0].HeaderText = "Id";
dataGridView1.Columns[0].DataPropertyName = "Id";
dataGridView1.Columns[0].ReadOnly = true;
dataGridView1.Columns[0].Width = 30;
dataGridView1.Columns[1].Name = "Name";
dataGridView1.Columns[1].HeaderText = "Name";
dataGridView1.Columns[1].DataPropertyName = "Name";
dataGridView1.Columns[1].ReadOnly = true;
dataGridView1.Columns[2].Name = "Country";
dataGridView1.Columns[2].HeaderText = "Country";
dataGridView1.Columns[2].DataPropertyName = "Country";
dataGridView1.Columns[2].ReadOnly = true;
dataGridView1.Columns[2].Width = 80;
DataGridViewComboBoxColumn returnstatus = new DataGridViewComboBoxColumn();
returnstatus.Name = "Status";
returnstatus.Width = 70;
returnstatus.Items.Add("Yes");
returnstatus.Items.Add("No");
dataGridView1.Columns.Insert(3, returnstatus);
DataGridViewDisableButtonColumn addRow = new DataGridViewDisableButtonColumn();
addRow.Width = 50;
addRow.Name = "AddButton";
addRow.HeaderText = "Add";
dataGridView1.Columns.Insert(4, addRow);
DataGridViewDisableButtonColumn deleteRow = new DataGridViewDisableButtonColumn();
deleteRow.Width = 60;
deleteRow.Name = "DeleteButton";
deleteRow.HeaderText = "Delete";
dataGridView1.Columns.Insert(5, deleteRow);
dataGridView1.DataSource = dt;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
dataGridView1.Rows[i].Cells["AddButton"].Value = "Add";
dataGridView1.Rows[i].Cells["DeleteButton"].Value = "Delete";
}
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 3)
{
DataGridViewDisableButtonCell buttonAdd = (DataGridViewDisableButtonCell)dataGridView1.Rows[e.RowIndex].Cells["AddButton"];
DataGridViewDisableButtonCell buttonDelete = (DataGridViewDisableButtonCell)dataGridView1.Rows[e.RowIndex].Cells["DeleteButton"];
if (dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString().ToLower() == "yes")
{
buttonAdd.Enabled = false;
buttonDelete.Enabled = false;
}
else
{
buttonAdd.Enabled = true;
buttonDelete.Enabled = true;
}
dataGridView1.Invalidate();
}
}
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "AddButton")
{
DataGridViewDisableButtonCell buttonCell = (DataGridViewDisableButtonCell)dataGridView1.Rows[e.RowIndex].Cells["AddButton"];
if (buttonCell.Enabled)
{
MessageBox.Show("Record Added.");
}
}
if (dataGridView1.Columns[e.ColumnIndex].Name == "DeleteButton")
{
DataGridViewDisableButtonCell buttonCell = (DataGridViewDisableButtonCell)dataGridView1.Rows[e.RowIndex].Cells["DeleteButton"];
if (buttonCell.Enabled)
{
MessageBox.Show("Record Deleted.");
}
}
}
}
public class DataGridViewDisableButtonColumn : DataGridViewButtonColumn
{
public DataGridViewDisableButtonColumn()
{
this.CellTemplate = new DataGridViewDisableButtonCell();
}
}
public class DataGridViewDisableButtonCell : DataGridViewButtonCell
{
private bool enabledValue;
public bool Enabled
{
get
{
return enabledValue;
}
set
{
enabledValue = value;
}
}
public override object Clone()
{
DataGridViewDisableButtonCell cell = (DataGridViewDisableButtonCell)base.Clone();
cell.Enabled = this.Enabled;
return cell;
}
public DataGridViewDisableButtonCell()
{
this.enabledValue = true;
}
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState,
object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
if (!this.enabledValue)
{
if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background)
{
SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor);
graphics.FillRectangle(cellBackground, cellBounds);
cellBackground.Dispose();
}
if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border)
{
PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
}
Rectangle buttonArea = cellBounds;
Rectangle buttonAdjustment = this.BorderWidths(advancedBorderStyle);
buttonArea.X += buttonAdjustment.X;
buttonArea.Y += buttonAdjustment.Y;
buttonArea.Height -= buttonAdjustment.Height;
buttonArea.Width -= buttonAdjustment.Width;
ButtonRenderer.DrawButton(graphics, buttonArea, PushButtonState.Disabled);
if (this.FormattedValue is String)
{
TextRenderer.DrawText(graphics, (string)this.FormattedValue, this.DataGridView.Font, buttonArea, SystemColors.GrayText);
}
}
else
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}
}
}
VB.Net
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim dt As DataTable = New DataTable()
dt.Columns.AddRange(New DataColumn(2) {
New DataColumn("Id", GetType(Integer)),
New DataColumn("Name", GetType(String)),
New DataColumn("Country", GetType(String))})
dt.Rows.Add(1, "John Hammond", "United States")
dt.Rows.Add(2, "Mudassar Khan", "India")
dt.Rows.Add(3, "Suzanne Mathews", "France")
dt.Rows.Add(4, "Robert Schidner", "Russia")
dataGridView1.AutoGenerateColumns = False
dataGridView1.ColumnCount = 3
dataGridView1.AutoSize = False
dataGridView1.ScrollBars = ScrollBars.Both
dataGridView1.AllowUserToAddRows = False
dataGridView1.Columns(0).Name = "Id"
dataGridView1.Columns(0).HeaderText = "Id"
dataGridView1.Columns(0).DataPropertyName = "Id"
dataGridView1.Columns(0).ReadOnly = True
dataGridView1.Columns(0).Width = 30
dataGridView1.Columns(1).Name = "Name"
dataGridView1.Columns(1).HeaderText = "Name"
dataGridView1.Columns(1).DataPropertyName = "Name"
dataGridView1.Columns(1).ReadOnly = True
dataGridView1.Columns(2).Name = "Country"
dataGridView1.Columns(2).HeaderText = "Country"
dataGridView1.Columns(2).DataPropertyName = "Country"
dataGridView1.Columns(2).ReadOnly = True
dataGridView1.Columns(2).Width = 80
Dim returnstatus As DataGridViewComboBoxColumn = New DataGridViewComboBoxColumn()
returnstatus.Name = "Status"
returnstatus.Width = 70
returnstatus.Items.Add("Yes")
returnstatus.Items.Add("No")
dataGridView1.Columns.Insert(3, returnstatus)
Dim addRow As DataGridViewDisableButtonColumn = New DataGridViewDisableButtonColumn()
addRow.Width = 50
addRow.Name = "AddButton"
addRow.HeaderText = "Add"
dataGridView1.Columns.Insert(4, addRow)
Dim deleteRow As DataGridViewDisableButtonColumn = New DataGridViewDisableButtonColumn()
deleteRow.Width = 60
deleteRow.Name = "DeleteButton"
deleteRow.HeaderText = "Delete"
dataGridView1.Columns.Insert(5, deleteRow)
dataGridView1.DataSource = dt
For i As Integer = 0 To dataGridView1.RowCount - 1
dataGridView1.Rows(i).Cells("AddButton").Value = "Add"
dataGridView1.Rows(i).Cells("DeleteButton").Value = "Delete"
Next
End Sub
Private Sub dataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dataGridView1.CellValueChanged
If e.ColumnIndex = 3 Then
Dim buttonAdd As DataGridViewDisableButtonCell = CType(dataGridView1.Rows(e.RowIndex).Cells("AddButton"), DataGridViewDisableButtonCell)
Dim buttonDelete As DataGridViewDisableButtonCell = CType(dataGridView1.Rows(e.RowIndex).Cells("DeleteButton"), DataGridViewDisableButtonCell)
If dataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString().ToLower() = "yes" Then
buttonAdd.Enabled = False
buttonDelete.Enabled = False
Else
buttonAdd.Enabled = True
buttonDelete.Enabled = True
End If
dataGridView1.Invalidate()
End If
End Sub
Private 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
Private Sub dataGridView1_CellClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles dataGridView1.CellClick
If dataGridView1.Columns(e.ColumnIndex).Name = "AddButton" Then
Dim buttonCell As DataGridViewDisableButtonCell = CType(dataGridView1.Rows(e.RowIndex).Cells("AddButton"), DataGridViewDisableButtonCell)
If buttonCell.Enabled Then
MessageBox.Show("Record Added.")
End If
End If
If dataGridView1.Columns(e.ColumnIndex).Name = "DeleteButton" Then
Dim buttonCell As DataGridViewDisableButtonCell = CType(dataGridView1.Rows(e.RowIndex).Cells("DeleteButton"), DataGridViewDisableButtonCell)
If buttonCell.Enabled Then
MessageBox.Show("Record Deleted.")
End If
End If
End Sub
Public Class DataGridViewDisableButtonColumn
Inherits DataGridViewButtonColumn
Public Sub New()
Me.CellTemplate = New DataGridViewDisableButtonCell()
End Sub
End Class
Public Class DataGridViewDisableButtonCell
Inherits DataGridViewButtonCell
Private Property enabledValue As Boolean
Public Property Enabled As Boolean
Get
Return enabledValue
End Get
Set(ByVal value As Boolean)
enabledValue = value
End Set
End Property
Public Overrides Function Clone() As Object
Dim cell As DataGridViewDisableButtonCell = CType(MyBase.Clone(), DataGridViewDisableButtonCell)
cell.Enabled = Me.Enabled
Return cell
End Function
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)
If Not Me.enabledValue Then
If (paintParts And DataGridViewPaintParts.Background) = DataGridViewPaintParts.Background Then
Dim cellBackground As SolidBrush = New SolidBrush(cellStyle.BackColor)
graphics.FillRectangle(cellBackground, cellBounds)
cellBackground.Dispose()
End If
If (paintParts And DataGridViewPaintParts.Border) = DataGridViewPaintParts.Border Then
PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle)
End If
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
ButtonRenderer.DrawButton(graphics, buttonArea, PushButtonState.Disabled)
If TypeOf Me.FormattedValue Is String Then
TextRenderer.DrawText(graphics, CStr(Me.FormattedValue), Me.DataGridView.Font, buttonArea, SystemColors.GrayText)
End If
Else
MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)
End If
End Sub
End Class
End Class
Screenshot

For more details refer below link.
Disable Buttons in a Button Column