C# 在DataGridViewImageColumn中使用空值显示空单元格

C# 在DataGridViewImageColumn中使用空值显示空单元格,c#,image,winforms,datagridview,datagridviewcolumn,C#,Image,Winforms,Datagridview,Datagridviewcolumn,我的表单有一个DataGridView控件,并且列0的类型为DataGridViewImageColumn 首次显示表单时,将显示一个空DataGridView控件,列0中有一个带有红色X的矩形。 将行添加到控件时,将显示相同的图标 如何摆脱带有红色X的框而不显示任何内容 我试过以下方法全局。错误\u列表\u严重性的值为0 dataGridView_ErrorList.Columns[Globals.ERROR_LIST_SEVERITY].DefaultCellStyle.NullValue

我的表单有一个DataGridView控件,并且
列0
的类型为
DataGridViewImageColumn

首次显示表单时,将显示一个空DataGridView控件,
列0
中有一个带有红色X的矩形。
将行添加到控件时,将显示相同的图标

如何摆脱带有红色X的框而不显示任何内容

我试过以下方法<代码>全局。错误\u列表\u严重性的值为0

dataGridView_ErrorList.Columns[Globals.ERROR_LIST_SEVERITY].DefaultCellStyle.NullValue = null;
还尝试过暴力,只是为了看看它是否有效:

dataGridView_ErrorList.Rows[0].Cells[0].Value = null;
你知道为什么这样不行吗?是否需要创建一个空白图像并将该值分配给空白图像?
当设置空值应该有效时,这似乎很愚蠢

如MSDN文档中所述,在类的“备注”部分,要用自定义映像替换默认错误映像,需要派生自的自定义类。
这允许覆盖属性(通常为只读)设置自定义图像。 而且,最终,要重写该方法

这是自定义
DataGridViewImageColumn
的实现,与自定义
DataGridViewImageCell
相结合,可将其配置为在未指定图像或绑定字段值为空时显示不同的默认图像

如果未指定图像,单元格也将在DataGridView新行中显示空内容

类构造函数有几个重载。您可以指定:

  • 列名(默认为
    ImageColumn
  • 列的标题文本(默认为
    ImageColumn
  • DataPropertyName
    ,如果列将绑定到数据源字段(默认为
    string.Empty
  • 没有图像时用作占位符的图像(默认为空位图)
要将自定义图像列添加到DataGridView,请使用
DataGridView.Columns.add()
方法,传递一个新的
DGVCustomImageColumn
,根据需要初始化。
在这里,我只是设置
列.Name
标题文本
数据属性名称

dataGridView1.Columns.Add(new DGVCustomImageColumn("ImageCol", "Image", "ImageField"));

DGVCustomImageColumn
类:

using System.Drawing;
using System.Windows.Forms;

class DGVCustomImageColumn : DataGridViewImageColumn
{
    private Bitmap dgvErrorBitmap = new Bitmap(1, 1);
    public DGVCustomImageColumn()
        : this("ImageColumn", "ImageColumn", string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText)
        : this(colName, headerText, string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText, string dataField)
        : this(colName, headerText, dataField, null) { }

    public DGVCustomImageColumn(string colName, string headerText, string dataField, Bitmap errorImage)
    {
        this.CellTemplate = new CustImageCell(errorImage ?? dgvErrorBitmap);
        this.DataPropertyName = dataField;
        this.HeaderText = headerText;
        this.Image = errorImage ?? dgvErrorBitmap;
        this.Name = colName;
    }

    protected class CustImageCell : DataGridViewImageCell
    {
        public CustImageCell() : this(null) { }
        public CustImageCell(Bitmap defaultImage) => this.DefaultNewRowValue = defaultImage;
        public override object DefaultNewRowValue { get; }
    }
}

如MSDN文档中所述,在类的备注部分,要用自定义映像替换默认错误映像,需要派生自的自定义类。
这允许覆盖属性(通常为只读)设置自定义图像。 而且,最终,要重写该方法

这是自定义
DataGridViewImageColumn
的实现,与自定义
DataGridViewImageCell
相结合,可将其配置为在未指定图像或绑定字段值为空时显示不同的默认图像

如果未指定图像,单元格也将在DataGridView新行中显示空内容

类构造函数有几个重载。您可以指定:

  • 列名(默认为
    ImageColumn
  • 列的标题文本(默认为
    ImageColumn
  • DataPropertyName
    ,如果列将绑定到数据源字段(默认为
    string.Empty
  • 没有图像时用作占位符的图像(默认为空位图)
要将自定义图像列添加到DataGridView,请使用
DataGridView.Columns.add()
方法,传递一个新的
DGVCustomImageColumn
,根据需要初始化。
在这里,我只是设置
列.Name
标题文本
数据属性名称

dataGridView1.Columns.Add(new DGVCustomImageColumn("ImageCol", "Image", "ImageField"));

DGVCustomImageColumn
类:

using System.Drawing;
using System.Windows.Forms;

class DGVCustomImageColumn : DataGridViewImageColumn
{
    private Bitmap dgvErrorBitmap = new Bitmap(1, 1);
    public DGVCustomImageColumn()
        : this("ImageColumn", "ImageColumn", string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText)
        : this(colName, headerText, string.Empty, null) { }
    public DGVCustomImageColumn(string colName, string headerText, string dataField)
        : this(colName, headerText, dataField, null) { }

    public DGVCustomImageColumn(string colName, string headerText, string dataField, Bitmap errorImage)
    {
        this.CellTemplate = new CustImageCell(errorImage ?? dgvErrorBitmap);
        this.DataPropertyName = dataField;
        this.HeaderText = headerText;
        this.Image = errorImage ?? dgvErrorBitmap;
        this.Name = colName;
    }

    protected class CustImageCell : DataGridViewImageCell
    {
        public CustImageCell() : this(null) { }
        public CustImageCell(Bitmap defaultImage) => this.DefaultNewRowValue = defaultImage;
        public override object DefaultNewRowValue { get; }
    }
}

请阅读此处的备注部分:。您需要一个自定义的
DataGridViewImageCell
和一个
DataGridViewImageColumn
来将其
CellTemplate
设置为自定义单元格。您可以轻松地将其添加到代码中,而无需使用DGV的设计器,并且结果与订阅
NewRowAdded
事件一样简单。非常感谢您,Jimi。我错过了微软网站上的那些评论。实际上,这个解决方案比我最初想象的要简单得多,因为我只需要在设计器中将AllowUserToAddress属性设置为False。DGV仅由代码填充,因此仍然需要设置属性。我的代码在添加新行时分配图像,因此图像永远不能为空。感谢您引导我找到解决方案!请阅读此处的备注部分:。您需要一个自定义的
DataGridViewImageCell
和一个
DataGridViewImageColumn
来将其
CellTemplate
设置为自定义单元格。您可以轻松地将其添加到代码中,而无需使用DGV的设计器,并且结果与订阅
NewRowAdded
事件一样简单。非常感谢您,Jimi。我错过了微软网站上的那些评论。实际上,这个解决方案比我最初想象的要简单得多,因为我只需要在设计器中将AllowUserToAddress属性设置为False。DGV仅由代码填充,因此仍然需要设置属性。我的代码在添加新行时分配图像,因此图像永远不能为空。感谢您引导我找到解决方案!丹