更改 DataGridViewImageColumn 中的图像值不会删除以前的图像
Changing image value in DataGridViewImageColumn does not remove previous image
问题:
当更改显示在 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];
}
}
--相同的结果 - 之前的图像仍然存在于新选择的图像之后。
(注意绿色复选标记后面的红色错误)
我用这个简单的代码测试了这样的场景:
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
较少的情况。
我想我知道你的问题可能是在哪里产生的。您设置 ValuesAreIcons
属性,它会影响背景的 alpha 通道,因此它是 "correct" 图标。我会尝试省略此设置并使用 PNG 图标,这样就可以了。
问题:
当更改显示在 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];
}
}
--相同的结果 - 之前的图像仍然存在于新选择的图像之后。
(注意绿色复选标记后面的红色错误)
我用这个简单的代码测试了这样的场景:
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
较少的情况。
我想我知道你的问题可能是在哪里产生的。您设置 ValuesAreIcons
属性,它会影响背景的 alpha 通道,因此它是 "correct" 图标。我会尝试省略此设置并使用 PNG 图标,这样就可以了。