DataGridView控件利用WebClient异步加载并显示网络上的图片
来源:互联网 发布:windows 画图工具 编辑:程序博客网 时间:2024/05/13 20:50
这两天就这个问题,把我给弄得个纠结啊!最后跟大家分享一下!当然会有BUG,请海涵我这个菜鸟,并给予指示!
最开始的时候,绑定数据加载图片,添加一个图片列,通过url地址下载显示出来,正确!如下图:
写的代码如下:
webservice的异步操作:
public int image_i = 0; //结果代表DataTable的行数
void service_GetListCompleted(object sender, GetListCompletedEventArgs e)
{
if (!e.Result)
{
MessageBox.Show(e.msg, "错误信息",MessageBoxButtons.OK,MessageBoxIcon.Error);
return;
}
dtgvw_RecipesList.DataSource = e.dt;
if (!DataGridView1.Columns.Contains("图片"))
{
DataGridViewColumn column = new DataGridViewImageColumn();
column.Name = "图片";
DataGridView1.Columns.Insert(1, column); //添加新DataGridView列
DataGridView1.Columns["图片"].Width = 100;
}
if (e.dt.Rows.Count <= 0)
return;
image_i = 0; //此处一定要归零,否则,在添加编辑之后重新加载的时候就会从最后一行+1开始,直接就报错over了
dt = e.dt;
WebClient wc = new WebClient();
if (e.Error == null && !e.Cancelled)
{
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(dt.Rows[image_i]["R_Image"].ToString()));
}
}
void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
if (e.Error == null && !e.Cancelled)
{
byte[] bytes = e.Result;
MemoryStream ms = new MemoryStream(bytes);
Image image = Image.FromStream(ms);
DataGridView1.Rows[image_i].Height = 100;
DataGridView1.Rows[image_i].Cells["图片"].Value = image;
image_i++;
if (image_i >= dtgvw_RecipesList.Rows.Count)
return;
WebClient wc = new WebClient();
if (e.Error == null && !e.Cancelled)
{
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(dt.Rows[image_i]["Image"].ToString()));
}
}
}
这样写出来,就是我上面图片展示的结果,但是,假如其中有一个图片的URL地址错误不能加载出来,那么它之后的图片都不会再加载了,如果不写 if (e.Error == null && !e.Cancelled)这段判断一下,在byte[] bytes = e.Result;这行就会报错,所以,菜鸟我想出来的办法就是:
if (e.Error == null && !e.Cancelled)
{
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(dt.Rows[image_i]["Image"].ToString()));
}
改成
try{
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(dt.Rows[image_i]["Image"].ToString()));
}
catch
{
mage_i++;
WebClient wc = new WebClient(); //如果之前定义过久无需再次定义了,此处再次说一个编程中遇到的问题(如果把WebClient 设置成全局变量,在异步时会报一个WebClient 不支持并发I/O操作,所以我就多次定义了)
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(dt.Rows[image_i]["Image"].ToString()));
}
无论在加载当前那行的图片是url地址错误还是其他任何错误都执行下一行,可以解决掉很多附带的其他问题!
------------------------------------------------------------------------一个菜鸟的工作总结
- DataGridView控件利用WebClient异步加载并显示网络上的图片
- C# Winform DataGridView中利用WebClient异步加载显示网络图片
- Winform DataGridView中利用WebClient异步加载显示网络地址的图片
- Winform DataGridView中利用WebClient异步加载显示网络地址的图片
- IOS从网络上异步加载一系列的图片并显示在tableview上的例子
- Android异步网络加载图片的控件
- Bitmap的二次采样,异步加载网络图片到控件上
- 使用异步任务加载网络上的图片
- Android ListView异步加载网络图片显示
- android图片网络异步加载显示
- Android从网络上 异步加载图片
- Android异步显示网络上的图片(使用Handler)
- android ListView利用SimpleAdapter显示特定布局并且异步加载网络图片
- 利用BindingSource.Filter筛选数据,并显示在DataGridView上
- BitMap高效显示策略(二):在ListView上异步加载网络图片
- 利用AsyncTask从网络上加载图片
- Android网络加载图片并滚动显示
- android 从网络加载图片并显示
- 女友语录集
- eygle's sqlplus script for generating the xls and html
- Phpcms所有系统变量列表 Phpcms V9 文件目录结构
- 不沉湎于过去,只活当下
- SSH2+JBPM4.4 整合常见错误
- DataGridView控件利用WebClient异步加载并显示网络上的图片
- 访问ebs的配置
- OGNL表达式
- iphone学习笔记(三)
- Java iText操作PDF文档
- JS radio动态控制内层radio可用与否
- Failed to obtain WLS Edit lock-Oracle Service Bus 10gR3
- Qt 中设置窗体透明度的几种方法
- Struts2转发类型