gridcontrol 图片列异步加载
在gridview中指定一列,将ColumnEdit设置成pictureEdit
在使用showDialog这里窗体后,需要frm.Dispose()将资源释放
1.将该列的UnboundType属性设置为bound(默认值)以外的数据类型
2.为该列设置一个窗体内全局唯一的FieldName,这个FieldName不能是窗体中绑定数据源的的列,否则不会触发绑定事件
3.处理CustomUnboundColumnData事件
gridView1.CustomUnboundColumnData += (s, e) => {
if (e.Column.Name == colImg1.Name)
{
//Console.WriteLine(colImg1.Name + ":" +DateTime.Now);
var it = e.Row as Q_SymptomRepositoryItem;
if (ImgDic.ContainsKey(it.Img1))
{
e.Value = ImgDic[it.Img1];
}
else
{
e.Value = XFormExtension.LoadingImgLazy.Value;
}
}
};
4.加载数据时启动图片异步下载,完成后使用SyncContext.Post刷新gridview
private void LoadImageSync(List<Q_SymptomRepositoryItem> list)
{
var imgList = list;
ThreadPool.QueueUserWorkItem((o) =>
{
using (WebClient wc = new WebClient())
{
for (int i = ; i < imgList.Count; i++)
{
var item = imgList[i];
try
{ if (string.IsNullOrWhiteSpace(item.Img1)) continue;
var bytes = wc.DownloadData(@"http://192.168.9.5:7111/getFile.ashx?rtype=repository&id=" + item.RecId); using (var ms = new MemoryStream(bytes))
{
ImgDic[item.Img1] = XFormExtension.EnsureImage(Image.FromStream(ms)); if (!IsRunning) return; SyncContext.Post((ox) =>
{
gridView1.RefreshData(); }, null);
}
}
catch (Exception ex)
{
Console.WriteLine("下载图片->" + ex.Message, "错误");
} }
} });
}
5.完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid; namespace WinDetectionClockAdmin
{
using DetectionClock.EFModel;
using System.Collections.Concurrent;
using System.Threading;
using System.Net;
using System.IO;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using WinDetectionClock; public partial class frmSymptomRepositoryItem : DevExpress.XtraEditors.XtraForm
{
public GridControl MainGrid { get; set; }
private SynchronizationContext SyncContext { get; set; }
public Q_SymptomRepository SymptomRepository { get; set; }
public bool IsRunning = false; private ConcurrentDictionary<string, Image> ImgDic = new ConcurrentDictionary<string, Image>(); public frmSymptomRepositoryItem(Q_SymptomRepository repository):this()
{
SymptomRepository = repository;
//加载数据
LoadData();
}
public frmSymptomRepositoryItem()
{
InitializeComponent();
MainGrid = gridControl1;
SyncContext = SynchronizationContext.Current;
this.StartPosition = FormStartPosition.CenterParent; #region 配置 gridControl this.ConfigGrid(gridControl1, true);
gridView1.CustomUnboundColumnData += (s, e) => {
if (e.Column.Name == colImg1.Name)
{
//Console.WriteLine(colImg1.Name + ":" +DateTime.Now);
var it = e.Row as Q_SymptomRepositoryItem;
if (ImgDic.ContainsKey(it.Img1))
{
e.Value = ImgDic[it.Img1];
}
else
{
e.Value = XFormExtension.LoadingImgLazy.Value;
}
}
}; gridControl1.MouseDoubleClick += (s, e) =>
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
GridHitInfo hInfo = gridView1.CalcHitInfo(new Point(e.X, e.Y));
if (!hInfo.InRow) return; //确保点的是数据行而不是标头 var ent = qSymptomRepositoryItemBindingSource.Current as Q_SymptomRepositoryItem;
if (ent == null) return; //hInfo.Column==null 标示点了行头
if (hInfo.Column!=null && hInfo.Column.Caption == "图片")
{ ////var img = gridView1.GetFocusedValue() as Image;
////new frmPhotoDetail(img).ShowDialog();
////return; } //双击其他标示修改
btnModify.PerformClick(); }
};
gridControl1.MouseUp += (s, e) =>
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
GridHitInfo hInfo = gridView1.CalcHitInfo(new Point(e.X, e.Y));
if (hInfo.InRow)
{
var ent = qSymptomRepositoryItemBindingSource.Current as Q_SymptomRepositoryItem;
if (ent != null)
{
if (hInfo.Column != null && hInfo.Column.Caption == "图片")
{
popupMenu1.ShowPopup(Control.MousePosition);
}
}
}
}
};
#endregion IsRunning = true; }
#region 窗体关闭处理
protected override void OnClosing(CancelEventArgs e)
{
IsRunning = false;
base.OnClosing(e);
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
ImgDic.ToList().ForEach(ent =>
{
ent.Value.Dispose();
});
}
#endregion
#region ToolBar Action private void LoadData()
{
using (var ctx = DBCtx.GetCtx())
{
var list= ctx.Q_SymptomRepositoryItem.Where(ent => ent.MainId == SymptomRepository.RecId).ToList();
qSymptomRepositoryItemBindingSource.DataSource = list; #region 加载图片信息
LoadImageSync(list);
#endregion }
} private void LoadImageSync(List<Q_SymptomRepositoryItem> list)
{
var imgList = list;
ThreadPool.QueueUserWorkItem((o) =>
{
using (WebClient wc = new WebClient())
{
for (int i = ; i < imgList.Count; i++)
{
var item = imgList[i];
try
{ if (string.IsNullOrWhiteSpace(item.Img1)) continue;
var bytes = wc.DownloadData(@"http://192.168.9.5:7111/getFile.ashx?rtype=repository&id=" + item.RecId); using (var ms = new MemoryStream(bytes))
{
ImgDic[item.Img1] = XFormExtension.EnsureImage(Image.FromStream(ms)); if (!IsRunning) return; SyncContext.Post((ox) =>
{
gridView1.RefreshData(); }, null);
}
}
catch (Exception ex)
{
Console.WriteLine("下载图片->" + ex.Message, "错误");
} }
} });
} private void btnAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
var frm = new frmSymptomRepositoryItemEdit();
frm.Owner = this;
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
qSymptomRepositoryItemBindingSource.Add(frm.NewEnt);
qSymptomRepositoryItemBindingSource.MoveLast();
LoadImageSync(new List<Q_SymptomRepositoryItem>() { frm.NewEnt as Q_SymptomRepositoryItem });
}
} private void btnModify_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{ var ent = qSymptomRepositoryItemBindingSource.Current as Q_SymptomRepositoryItem; if (ent == null) return; var old = this.Snapshoot<Q_SymptomRepositoryItem>(ent); var frm = new frmSymptomRepositoryItemEdit(ent);
frm.Owner = this;
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
qSymptomRepositoryItemBindingSource.ResetCurrentItem(); LoadImageSync(new List<Q_SymptomRepositoryItem>() { ent });
}
else
{
this.Restore<Q_SymptomRepositoryItem>(old, ent);
} //连续加载测试
btnModify.PerformClick();
} private void btnDel_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
try
{
var cur = qSymptomRepositoryItemBindingSource.Current as Q_SymptomRepositoryItem;
if (cur == null) return; if (MessageBox.Show("您确定删除吗?", "警告", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
{
using (var ctx = DBCtx.GetCtx())
{
var it = ctx.Q_SymptomRepositoryItem.FirstOrDefault(ent => ent.RecId == cur.RecId);
if (it != null)
{
ctx.DeleteObject(it); ctx.SaveChanges();
qSymptomRepositoryItemBindingSource.Remove(cur);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} private void btnRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
LoadData();
} private void btnFilter_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
this.ShowFilter();
}
#endregion private void btnViewImg_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
popupMenu1.HidePopup();
var img = gridView1.GetFocusedValue() as Image;
new frmPhotoDetail(img).ShowDialog();
return;
} private void frmSymptomRepositoryItem_Load(object sender, EventArgs e)
{ var timer = new System.Windows.Forms.Timer();
timer.Interval = ;
timer.Tick += (s, ie) =>
{
timer.Enabled = false;
this.Close();
};
timer.Start();
}
}
}
gridcontrol 图片列异步加载的更多相关文章
- Android中图片的异步加载
转: 1. 为什么要异步加载图片 下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验 2. SoftReference的作用 栈内存—引用 堆内存—对象 Eg: Object ...
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...
- 【jar包】图片的异步加载--【 Imageloader】
Android Imageloader图片异步加载 Imageloader是一个在android平台下简单的下载.显示.缓存空间的图片加载库. 异步下载网络图片并可以在UI线程更新View,使用二级缓 ...
- BitmapImage处理网络图片,例如阿里云获取的图片。异步加载到需要显示的控件上。提升速度非常明显。
想直接把网络图片赋给控件,又要下载又要缓存,速度非常慢.不流畅. 需要进行处理,异步加载会显著提升速度.方法如下: public static BitmapImage ByteArrayToBitma ...
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)
转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...
- 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载
apple sample lazytableimages 1,首先设置横向显示的uitableview self.customTableview.transform = CGAffineTransfo ...
- 【Android】纯代码创建页面布局(含异步加载图片)
开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...
- ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片
一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
随机推荐
- Mongodb 安装 和 启动
教程:http://www.mongodb.org.cn/tutorial/59.html 下载 >wget https://fastdl.mongodb.org/linux/mongodb-l ...
- Spring mvc RequestContextHolder分析
转载: http://blog.csdn.net/zzy7075/article/details/53559902
- UI5-文档-4.18-Icons
我们的对话框仍然是空的.因为SAPUI5附带了一个包含500多个图标的大图标字体,所以我们将在对话框打开时添加一个图标来问候用户. Preview An icon is now displayed i ...
- Oracle12c部署
部署环境业务系统与数据库服务部署在一台服务器上了 电脑是台式机没有网络,也没有插网线,需要先建立一个网络回环,然后进行Oracle12c的安装,安装过程中系统会默认勾选创建为容器数据库,需要把这个勾选 ...
- centos7 莫名重起的问题
ausearch -i -m system_boot,system_shutdown | tail -4----type=SYSTEM_BOOT msg=audit(2018年05月10日 07:45 ...
- 微擎系统 微信支付 get_brand_wcpay_request:fail
支付授权目录问题,有一个是域名加app的
- Eclipse安装教程
Eclipse安装教程 (Win7_64bit + Eclipse_64bit + JDK_8u131_64bit + python2.7.8 + PyDev5.7.0插件) 适用操作系统:W ...
- electron 大体结构
1.Electron支持的平台: OS XWindowsLinux 2.一个标准的electron app包含的结构: Windows 或是 Linux中:electron/resources/app ...
- 项目中调试SQLServer 方便的查看SQL语句的执行时间的方法
第一种方法,先记录执行前的时间,然后在记录执行Sql后的时间,然后做减法 1 第一种方法: 2 declare @begin_date datetime 3 declare @end_date dat ...
- .net使用httpHandler添加图片防盗链
.net使用httpHandler添加图片防盗链1. 配置web.config: <!--图片添加水印的配置--> <httpHandlers> <add verb=&q ...