【问题标题】:Changing image value in DataGridViewImageColumn does not remove previous image更改 DataGridViewImageColumn 中的图像值不会删除以前的图像
【发布时间】:2019-12-05 18:18:31
【问题描述】:

问题:

当更改 DataGridViewImageColumn 的单元格中显示的图像时,之前的图像仍然在新图像的后面:

(注意绿色勾号后面的红色错误)

我有什么:

图像显示了与机器的连接状态。当机器的状态更新时,会引发一个事件并更新图像。

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() 方法,以防它只需要重绘。 - 没有变化

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

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];
            }


        }

--same result - 之前的图像仍然存在于新选择的图像后面。

(注意绿色勾号后面的红色错误)

【问题讨论】:

  • 如何填写DataGridView?它是来自分配给DataSource 的数据库中的DataTable 吗?如果是,如果您在DataTable 中进行更改并更新数据源会怎样?另外,你使用绑定吗?

标签: c# winforms datagridview datagridviewimagecolumn


【解决方案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;
}

它可以正常工作:

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

这适用于未绑定和DataSource-less 的场景。

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

【讨论】:

  • 不 - 没有数据绑定。我添加了“valuesareicons”行以尝试解决问题 - 但我发现你的想法 - 资源被添加为图标而不是图像,我进行了更改,以便它们现在正确存储为图像 - 将很快测试.
  • 就是这样 - 图像本身作为图标而不是图像存储在资源部分中 - 进行更改解决了问题。
  • 我使用的时候也发现了:ImageLayout = DataGridViewImageCellLayout.Stretch
  • 很高兴它有帮助:-)。我通常不会使用DataGridViewImageCellLayout.Stretch,因为它会使图像变形。如果要填充单元格,通常需要使用 Zoom 选项。
  • .Zoom 正是我用来替换 .Stretch 的东西——而且效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多