Winforms DataGridViewImageColumn红色x

Winforms DataGridViewImageColumn红色x,winforms,datagridview,Winforms,Datagridview,我已经创建了DataGridView并添加了DataGridViewImageColumn(使用设计器) DataGridView具有“AllowUserToAddress=true”,因此将显示一个空行,供用户在中输入新行。在这一空行中,DataGridViewImageColumn显示一个红色的x。我希望在列中始终显示相同的图像,而不管行是否包含任何数据(我正在绑定单元格的click事件,因此使用DataGridViewImageColumn作为按钮) 如何摆脱红色x?我找到了一个解决方案,

我已经创建了DataGridView并添加了DataGridViewImageColumn(使用设计器)

DataGridView具有“AllowUserToAddress=true”,因此将显示一个空行,供用户在中输入新行。在这一空行中,DataGridViewImageColumn显示一个红色的x。我希望在列中始终显示相同的图像,而不管行是否包含任何数据(我正在绑定单元格的click事件,因此使用DataGridViewImageColumn作为按钮)


如何摆脱红色x?

我找到了一个解决方案,但我不确定这是最好的方法

我重写RowsAdded事件并将DataGridViewImageColumn的值设置为null。我认为,由于该值为null,它将显示图像

private void dgvWorksheet_RowsAdded(object sender, 
     DataGridViewRowsAddedEventArgs e)
{
    dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null;
}
我还将列的null值设置为null,格式为_Load

colStartClock.DefaultCellStyle.NullValue = null;

我不确定我还需要做什么。它似乎在工作,但似乎有点问题-随机单击有时会导致异常,因此需要进行更多的调查。

我使用图像列表保存所有图像,但这里有一个精简版本应该会有所帮助。设置该值是正确的,但应将其设置为与位图相同的空值,位图只是一个静态空白图像。我使用:

e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage;
其中,nullImage在类的前面定义为:

private readonly Image nullImage = new Bitmap(1, 1);

我仔细研究了这些解决方案,实现这一点的方法是在构造函数中调用
InitializeComponent()
使数据绑定行的默认图像成为空图像后执行此操作

dataGridView1.Columns[0].DefaultCellStyle.NullValue = null;
并钩住
RowPrePaintEvent
以删除网格末尾空行的红色X,因为
allowUserToAddress=true

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
      if (e.RowIndex >= numberOfRows)
      {
           dataGridView1.Rows[e.RowIndex].Cells[0].Value = null;
      }
}

其中
numberOfRows
是网格中的有效行数。只是花了几个小时来处理这件事。希望这能帮其他人省去麻烦…

我像这样使用grid.row的IsNewRow属性

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) {
      DataGridViewRow row = dgUserFileList.Rows[e.RowIndex];
      if (row.IsNewRow) {
          row.Cells[0].Value = null;
        }
      }
    }

另一种避免DataGridView中所有DataGridViewImageColumn元素出现此默认行为的方法是拦截CellFormatting事件:

dataGridView1.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.RowIndex < 0 || e.ColumnIndex < 0)
        return;

    var grid = (DataGridView)sender;
    if (grid.Columns[e.ColumnIndex] is DataGridViewImageColumn &&
        grid[e.ColumnIndex, e.RowIndex].DefaultNewRowValue.Equals(e.Value))
        e.Value = null;
};
dataGridView1.CellFormatting+=委托(对象发送者,DataGridViewCellFormattingEventArgs e)
{
如果(e.RowIndex<0 | | e.ColumnIndex<0)
返回;
var grid=(DataGridView)发送方;
如果(grid.Columns[e.ColumnIndex]是DataGridViewImageColumn&&
网格[e.ColumnIndex,e.RowIndex].DefaultNewRowValue.Equals(e.Value))
e、 值=空;
};
这样,组件将始终为单元格使用空值映像,而不是默认的“不可用映像”。

在以下方面相当详细:

默认情况下,空单元格显示默认错误图形。阻止 当单元格值等于null或 ,设置 属性返回的单元格样式对象为null 将行添加到控件之前。这不会影响的行 然而,新的记录。防止错误图形出现在 当控件属性 值为true,还必须将单元格值显式设置为 null在控件事件的处理程序中,或设置列 属性的实例 -具有被重写的 返回null的属性

转换为代码意味着您可以在添加任何行之前执行此操作:

然后把这个类放在某个地方:


或者在
行中将
单元格.Value
设置为null。添加的
事件。

如果一行没有数据,为什么显示/可见?大脑,显示一个空白行,因为“AllowUserToAddress=true”。我已经编辑了我的问题,将其包括在内。
var column = new DataGridViewImageColumn();
column.DefaultCellStyle.NullValue = null;
column.CellTemplate = new DataGridViewEmptyImageCell();
private class DataGridViewEmptyImageCell : DataGridViewImageCell
{
    public override object DefaultNewRowValue { get { return null; } }
}