在DataGridViewImageColumn中更改图像值不会删除先前的图像

时间:2019-12-05 18:18:31

标签: c# winforms datagridview datagridviewimagecolumn

问题:

更改DataGridViewImageColumn的单元格中显示的图像时,先前的图像仍位于新图像的后面:

Example 1

(请注意绿色复选标记后面的红色错误)

我所拥有的:

图像显示与计算机的连接状态。机器状态更新后,将引发事件并更新图像。

DataGridViewImageColumn的声明:

DataGridViewImageColumn imc = new DataGridViewImageColumn
            {
                HeaderText = "C$",
                Name = "imc",
                Width = 25,
                ImageLayout = DataGridViewImageCellLayout.Stretch,
                ValuesAreIcons = true
            }; 

设置默认值:

sDGView.Columns["imc"].DefaultCellStyle.NullValue = null;
((DataGridViewImageCell)sDGView.Rows[0].Cells["imc"]).Value = null;

添加行时的事件:

private void SDGView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
((DataGridViewImageCell)sDGView.Rows[LastRow].Cells["imc"]).Value = null;
        }

在线状态更改时调用的方法:

private void SetStatusImage(int ri)
        {
            var status = Core.Machines[ri].OnLine;

            //sDGView.Rows[ri].Cells["imc"].Dispose();

            var image = (DataGridViewImageCell)sDGView.Rows[ri].Cells["imc"];

            if (status is null)
            {
                image.Value = StatusImg[0];
            }
            else if (status is true)
            {
                image.Value = StatusImg[1];
            }
            else
            {
                image.Value = StatusImg[2];
            }
        }

图像:

public Icon[] StatusImg { get; private set; } = new Icon[]
        {
            Properties.Resources.Minus_Grey,
            Properties.Resources.Tick_Green,
            Properties.Resources.Error_Red
        };

我尝试过的...

我尝试将image.Value设置为null-不变

我已经在单元格本身上调用了Dispose()方法,然后创建了一个新的单元格来代替它并将其值设置为当前图像-先前的图像仍显示在后面!

似乎每次更改单元格的值时,都会在顶部简单地添加另一个图像。我可以通过观察程序的内存大小随着图像的变化而增加来进行验证。即使调用Dispose()方法,旧的方法也不会真正消失。

编辑:

我尝试让主窗体调用Refresh()方法,以防它只需要重绘。 -没有变化

我尝试删除image变量并直接设置图像:

private void SDGView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
                            ((DataGridViewImageCell)sDGView.Rows[LastRow].Cells["imc"]).Value = StatusImg[0];
        }
private void SetStatusImage(int ri)
        {
            var status = Core.Machines[ri].OnLine;

            //sDGView.Rows[ri].Cells["imc"].Dispose();

            //var image = (DataGridViewImageCell)sDGView.Rows[ri].Cells["imc"];

            if (status is null)
            {
                //image.Value = StatusImg[0];
                ((DataGridViewImageCell)sDGView.Rows[ri].Cells["imc"]).Value = StatusImg[0];
            }
            else if (status is true)
            {
                //image.Value = StatusImg[1];
                ((DataGridViewImageCell)sDGView.Rows[ri].Cells["imc"]).Value = StatusImg[1];
            }
            else
            {
                //image.Value = StatusImg[2];
                ((DataGridViewImageCell)sDGView.Rows[ri].Cells["imc"]).Value = StatusImg[2];
            }


        }

-相同的结果-先前的图像仍保留在新选择的图像后面。

Example 2

(请注意绿色复选标记后面的红色错误)

1 个答案:

答案 0 :(得分:1)

我用以下简单代码测试了这种情况:

private void PlanningDayPlans_Load(object sender, EventArgs e)
{
    DataGridViewRow r = new DataGridViewRow();
    this.DataGridView1.Rows.Add(r);
}

private void Button1_Click(object sender, EventArgs e)
{
    this.DataGridView1.Rows(0).Cells(0).Value = My.Resources.todo2;
}

private void Button2_Click(object sender, EventArgs e)
{
    this.DataGridView1.Rows(0).Cells(0).Value = My.Resources.cross;
}

它可以正常工作:

enter image description here

图片是具有透明背景的PNG(会显示问题),我可以来回切换它们,效果很好。

这是针对无约束且少DataSource的情况。

我想我知道您的问题可能在哪里产生的。您设置了ValuesAreIcons属性,该属性会影响背景的Alpha通道,因此它对于图标是“正确的”。我会尝试省略此设置并使用PNG图标,这会很好。