C# 删除datagridview图像列最后一行中的红色x

C# 删除datagridview图像列最后一行中的红色x,c#,winforms,datagridview,C#,Winforms,Datagridview,我尝试使用下面的两个代码示例,都删除了红色的x,但在显示时会导致无限循环。一旦由于某种原因将单元格设置为RowPrePaint中的AddNewIndex.bmp,它将再次调用RowPrePaint。然后e再次为0,并且它继续循环。有人知道如何将值设置为AddNewIndex.bmp,而不会再次执行RowPrePaint吗?(或者用不同的方法去除红色的x?)我知道下一次,是什么导致RowPrePaint被多次调用 private void tableDocTypes_RowPrePaint

我尝试使用下面的两个代码示例,都删除了红色的x,但在显示时会导致无限循环。一旦由于某种原因将单元格设置为RowPrePaint中的AddNewIndex.bmp,它将再次调用RowPrePaint。然后e再次为0,并且它继续循环。有人知道如何将值设置为AddNewIndex.bmp,而不会再次执行RowPrePaint吗?(或者用不同的方法去除红色的x?)我知道下一次,是什么导致RowPrePaint被多次调用

    private void tableDocTypes_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        if (e.RowIndex >= tableDocTypes.NewRowIndex)
            tableDocTypes.Rows[e.RowIndex].Cells[columnDocTypeImage.Index].Value = Properties.Resources.AddNewIndex;
    }


    private void tableDocTypes_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        if (tableDocTypes.Rows[e.RowIndex].IsNewRow) 
            tableDocTypes.Rows[e.RowIndex].Cells[columnDocTypeImage.Index].Value = Properties.Resources.AddNewIndex;
    }
还在构造函数中添加以下内容:

        InitializeComponent();
        tableDocTypes.Columns[columnDocTypeImage.Index].DefaultCellStyle.NullValue = Properties.Resources.AddNewIndex;

RowPrePaint在需要重新绘制行时激发。如果您修改某行中的内容,则该行需要重新绘制,并无限递归


我不完全清楚您试图实现的是什么,但我的猜测是您希望更改特定单元格的显示内容。最好的方法之一是处理CellFormatting事件。在这种情况下,您将更改传入的
DataGridViewCellFormattingEventArgs.Value
,而不是基础数据。

如果您使用数据集填充DataGridView,请在创建表时添加以下代码:

DataTable dt = new DataTable();

dt.Columns.Add("ImageColumn");
dt.Columns["ImageColumn"].DataType = typeof(Byte[]);
即使是从数据库填充,也可以在将数据添加到表之前进行设置

Private Sub DGV_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DGV.CellPainting
    'get rid of that annoying red x
    If e.ColumnIndex = sender.Columns("ImageColumn").Index Then
        If e.RowIndex = sender.RowCount - 1 Then
            sender(e.ColumnIndex, e.RowIndex).Value = Nothing
        End If
    End If
End Sub

尝试上面的CellPainting代码来摆脱这个非常烦人和耗时的bug。

你是说“坏图像”红色X吗?如果是这样,您是否已将列设置为typeof(Byte[])?是的,这是“断开的图像”红色X。如何将列更改为typeof(Byte[])?谢谢,使用CellFormatting事件现在可以正常工作,但一旦单击旁边的单元格,红色X将重新出现。我认为这是因为我实际上没有在DataGridView中更改图像,而只是更改值。如果我尝试更改DataGridView,我会遇到相同的无限循环问题。我正在使用设计器创建DataGridView。我以前从未使用过数据表。有没有一种方法可以在不创建数据表的情况下更改数据类型?如果您也要在设计器中创建DataGridView中的所有列,请选择该列,然后将ColumnType更改为DataGridViewImageBoxColumn。这就是当前设置的值。由于最后一行中没有图像,它显示的是红色的x。因此只有部分行会有图像?我采纳了您的建议,通过编程将图像设置为tableDocTypes.rows[tableDocTypes.NewRowIndex]。Cells[columnDocTypeImage.Index]。Value=Properties.Resources.AddNewIndex。与我以前做的事情相比非常简单。再次感谢你的帮助。