C# winform中DataGridview绑定数据库CellFormatting无法自动更新

xmxqiyan 2014-11-16 09:48:05
我有一张数据表,读取到datatable中
其中一个字段为<在线状态>,它的值可能是“在线”或者“离线”
现在通过datagridview绑定这张表,绑定之前加了一列DataGridViewImageColumn

DataGridViewImageColumn column = new DataGridViewImageColumn();
column.Name = "OnlineState";
column.HeaderText = "状态";
dgv.Columns.Insert(0, column);

dgv.DataSource = table;


绑定后通过CellFormatting事件来更新DataGridViewImageColumn列的图片

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dgv.Columns[e.ColumnIndex].Name.Equals("OnlineState") && dgv.Columns.Count > 3)
{
string key;
string s = (string)dgv.Rows[e.RowIndex].Cells["在线状态"].Value;
if (s == "在线")
{
key = "online";
}
else
{
key = "offline";
}
e.Value = imageList1.Images[key]; // 通过值来取出对应的图片
e.FormattingApplied = true;

}
}

在开始绑定、界面刷新时显示没有问题,“OnlineState”的图片都会跟着“在线状态”的值变化,但是在界面不动的情况下,程序内部改变了table中“在线状态”的值,dgv上也可以看到该值的变化,但就是“OnlineState”的图片没有跟着刷新。请问怎么才能解决这个问题?
...全文
494 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmxqiyan 2014-11-17
  • 打赏
  • 举报
回复
引用 8 楼 wawd74520 的回复:
 dt.Rows[0][0] = Image.FromFile("");
试试直接在dt里面给图片看看 然后在这样。 dgv.DataSource = dt;
目前这种方法比较可行
xmxqiyan 2014-11-17
  • 打赏
  • 举报
回复
引用 7 楼 xdashewan 的回复:
[quote=引用 4 楼 xmxqiyan 的回复:] 刷新到是能及时刷新,但是太占资源,界面一直响应不过来,显示的图片列一直在闪。
转你一句msdn原话: 避免性能下降,当处理此事件,访问单元格通过事件处理程序的参数而不是直接时访问单元格。[/quote] 之前就是通过事件的参数赋值才会出现图片没有跟着变化
失落的神庙 2014-11-17
  • 打赏
  • 举报
回复
遍历dt更新值 不去对dgv遍历 更新dt后重新绑定在dgv上。
失落的神庙 2014-11-17
  • 打赏
  • 举报
回复
 dt.Rows[0][0] = Image.FromFile("");
试试直接在dt里面给图片看看 然后在这样。 dgv.DataSource = dt;
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
引用 4 楼 xmxqiyan 的回复:
刷新到是能及时刷新,但是太占资源,界面一直响应不过来,显示的图片列一直在闪。
转你一句msdn原话: 避免性能下降,当处理此事件,访问单元格通过事件处理程序的参数而不是直接时访问单元格。
於黾 2014-11-17
  • 打赏
  • 举报
回复
你可以加一个隐藏列,把旧值写在里面
於黾 2014-11-17
  • 打赏
  • 举报
回复
引用 4 楼 xmxqiyan 的回复:
[quote=引用 3 楼 wawd74520 的回复:] dgv.Rows[e.RowIndex].Cells[x]=imageList1.Images[key];
刷新到是能及时刷新,但是太占资源,界面一直响应不过来,显示的图片列一直在闪。[/quote] 赋值之前先做判断,如果没变,就不要更新图片,就好了
xmxqiyan 2014-11-17
  • 打赏
  • 举报
回复
引用 3 楼 wawd74520 的回复:
dgv.Rows[e.RowIndex].Cells[x]=imageList1.Images[key];
刷新到是能及时刷新,但是太占资源,界面一直响应不过来,显示的图片列一直在闪。
失落的神庙 2014-11-17
  • 打赏
  • 举报
回复
dgv.Rows[e.RowIndex].Cells[x]=imageList1.Images[key];
失落的神庙 2014-11-17
  • 打赏
  • 举报
回复
别使用这个 e.Value = imageList1.Images[key]; 遍历试试。
xmxqiyan 2014-11-17
  • 打赏
  • 举报
回复
自己顶一个,盼大师

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧