在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 图片列异步加载的更多相关文章

  1. Android中图片的异步加载

    转: 1.  为什么要异步加载图片 下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验 2.  SoftReference的作用 栈内存—引用 堆内存—对象 Eg: Object ...

  2. WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

    原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...

  3. 【jar包】图片的异步加载--【 Imageloader】

    Android Imageloader图片异步加载 Imageloader是一个在android平台下简单的下载.显示.缓存空间的图片加载库. 异步下载网络图片并可以在UI线程更新View,使用二级缓 ...

  4. BitmapImage处理网络图片,例如阿里云获取的图片。异步加载到需要显示的控件上。提升速度非常明显。

    想直接把网络图片赋给控件,又要下载又要缓存,速度非常慢.不流畅. 需要进行处理,异步加载会显著提升速度.方法如下: public static BitmapImage ByteArrayToBitma ...

  5. android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)

    转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...

  6. 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载

    apple sample lazytableimages 1,首先设置横向显示的uitableview self.customTableview.transform = CGAffineTransfo ...

  7. 【Android】纯代码创建页面布局(含异步加载图片)

    开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1 先看看总体效果 本示例是基于Fragment进行的,直接上代码: [界面结构] 在 F ...

  8. ANDROID_MARS学习笔记_S04_009_用java.lang.ref.SoftReference作缓存,android.os.Handler和new Thread异步加载略图片

    一.简介 二.代码流程 1.private Map<String, SoftReference<Drawable>> imageCache = new HashMap<S ...

  9. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

随机推荐

  1. win10 QQ远程协助部分界面点不了

    win10 QQ远程协助部分界面点不了. 把对方电脑的电脑管家全部退出,退出了也不行. 是win10的防火墙?安全策略?

  2. c++builder Delphi 直接使用剪贴板 Clipboard

    c++builder Delphi 直接使用剪贴板 Clipboard 剪贴板 delphi use  Vcl.Clipbrd procedure TForm27.FormCreate(Sender: ...

  3. body 标签

    -图标 &nbsp(空格) -&gt(>) &lt(<) -p标签, 段落 <br \>  做换行 所有的标签分为: 块级标签: div(白板), H系 ...

  4. UI5-文档-2.2-使用SAP Web IDE开发应用程序

    SAP Web IDE是一种基于Web的开发环境,它是为使用最新的创新开发SAPUI5复杂的应用程序.开发和扩展SAP Fiori应用程序.开发移动混合应用程序以及使用插件和模板扩展SAP Web I ...

  5. jenkins 修改工作目录

    修改Jenkins路径 Jenkins的默认安装路径是/var/lib/jenkins 现在由于这个根目录的磁盘太小,所以切换到/data 目录下. Jenkins目录.端口.工作目录等信息在/etc ...

  6. hibernate注解主键生成策略

    Id生成策略: @GeneratedValue,JPA通用策略生成器 . JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.  TABLE:使用一个特定的数据库表格来 ...

  7. How To Pronounce 3-Syllable Phrases

    How To Pronounce 3-Syllable Phrases Share Tweet Share Tagged With: 3-Syllable Learn about the stress ...

  8. sqlserver解密加密的存储过程(图解)

    来自博客:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html

  9. EasyUI_tabs和layout布局, 点击链接打开标签, 重复点击选中标签

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  10. Oracle CHAR,VARCHAR,VARCHAR2,nvarchar类型的区别与使用(转载)

    一 varchar,varchar2,nvarchar,nvarchar2 四个类型都属于变长字符类型, varchar和varchar2的区别在与后者把所有字符都占两字节,前者只对汉字和全角等字符占 ...