DataGridViewButtonColumn 充当 DataGridViewCheckBoxColumn

DataGridViewButtonColumn acting as DataGridViewCheckBoxColumn

我想让DataGridViewButtonColumn充当DataGridViewCheckBoxColumn。意思是在按钮内有一些图像作为 true 和另一个图像作为 false 并通过 DataMember 绑定到 属性。 我认为 class 继承自 DataGridViewCheckBoxColumnoverride paint 方法 "should" 有效。

只需使用 DataGridViewCheckBoxColumn 但要处理 DataGridViewCellPaint 事件,并为选中状态绘制一个图像,为未选中状态绘制另一个图像。

例子

创建一个名为 Form1Form,然后在窗体上放置一个 DataGridView 控件,并用以下代码替换 Form1.cs 的内容。还要确保将 Checked and UnChecked 图片添加到 Resources.

然后你会看到这样的结果:

public Form1()
{
    InitializeComponent();
    this.Load += Form1_Load;
    this.dataGridView1.CellPainting += dataGridView1_CellPainting;
}
private void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();
    dt.Columns.Add("Column1", typeof(bool));
    dt.Rows.Add(false);
    dt.Rows.Add(true);
    this.dataGridView1.DataSource = dt;
}
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex >= 0)
    {
        var value = (bool?)e.FormattedValue;
        e.Paint(e.CellBounds, DataGridViewPaintParts.All &
                                ~DataGridViewPaintParts.ContentForeground);
        var img = value.HasValue && value.Value ?
            Properties.Resources.Checked : Properties.Resources.UnChecked;
        var size = img.Size;
        var location = new Point((e.CellBounds.Width - size.Width) / 2,
                                    (e.CellBounds.Height - size.Height) / 2);
        location.Offset(e.CellBounds.Location);
        e.Graphics.DrawImage(img, location);
        e.Handled = true;
    }
}