处理CellContentClick 事件以切换当前单元格的值(真/假)。 DataGridViewCheckBoxColumn 的 CellContent 是复选框。
假设DataGridViewCheckBoxColumn 是第一列:
private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex >= 0)
{
var s = sender as DataGridView;
var b = s[e.ColumnIndex, e.RowIndex].Value == null
? true
: (bool)s[e.ColumnIndex, e.RowIndex].Value;
s[e.ColumnIndex, e.RowIndex].Value = !b;
}
}
如果您希望通过单击单元格上的任意位置(而不是仅在复选框上)来切换值,请改为处理 CellMouseClick:
private void dgv_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.ColumnIndex == 0 && e.RowIndex >= 0)
{
var s = sender as DataGridView;
var b = s[e.ColumnIndex, e.RowIndex].Value == null
? true
: (bool)s[e.ColumnIndex, e.RowIndex].Value;
s[e.ColumnIndex, e.RowIndex].Value = !b;
s.NotifyCurrentCellDirty(true);
}
}
无论哪种方式,CellPainting 事件都会触发,并在您单击时绘制指定的图像。
CellPainting 示例:
Bitmap bmp1 = Properties.Resources.GreenImage;
Bitmap bmp2 = Properties.Resources.RedImage;
private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex >= 0)
{
var s = sender as DataGridView;
e.Paint(e.CellBounds, DataGridViewPaintParts.Background
| DataGridViewPaintParts.Border
| DataGridViewPaintParts.SelectionBackground
| DataGridViewPaintParts.Focus
| DataGridViewPaintParts.ErrorIcon);
if (e.Value != null)
{
var r = new Rectangle((e.CellBounds.Width - 16) / 2 + e.CellBounds.X,
(e.CellBounds.Height - 16) / 2 + e.CellBounds.Y, 16, 16);
var b = (bool)e.Value;
e.Graphics.DrawImage(b ? bmp1 : bmp2, r);
}
e.Handled = true;
}
}