如何在 DevExpress.XtraGrid.GridControl 显示图片列。 方法很多,我把它们逐一写在附言中,方便大家分情况合理使用。
第 1 条附言 · 6 月前
GridControl一列的ColumnEdit属性中选择PictureEdit,一个RepositoryItemPictureEdit添加完成。列的FieldName设置为Image列名,如img。
GridControl绑定的数据,不管是DataTable、List或者其他源,添加一个列,列名为img。 以DataTable为例:
Image xx=Image.FromFile( "xxx" ),yy=Image.FromFile( "yyy" ); dt.Columns.Add( "img" ); foreach (DataRow dr in dt.Rows) { if (dr[ "imgflag" ].ToString()== "1" ) dr[ "img" ]=xx; else dr[ "img" ]=yy; } |
第 2 条附言 · 6 月前
上一篇介绍的是直接使用Image类型,也可以使用byte[]。
如果数据库中直接存的二进制,没什么好说的,直接DataSource=dt绑定完成即可。
下面是一个image路径的例子。
private void showData(List list) { DataTable dt = new DataTable( "OneEmployee" ); dt.Columns.Add( "Caption" ,System.Type.GetType( "System.String" )); dt.Columns.Add( "Department" ,System.Type.GetType( "System.String" )); dt.Columns.Add( "PhotoName" ,System.Type.GetType( "System.Byte[]" )); for ( int i = 0; i < list.Count; i++) { DataRow dr = dt.NewRow(); dr[ "Caption" ] = list[i].Name; dr[ "Department" ] =list[i].Department; string imagePath = @"D:/C#/photos/" + list[i].PhotoPath; dr[ "PhotoName" ] = getImageByte(imagePath); dt.Rows.Add(dr); } gridControl1.DataSource = dt; } //返回图片的字节流byte[] private byte [] getImageByte( string imagePath) { FileStream files = new FileStream(imagePath,FileMode.Open); byte [] imgByte = new byte [files.Length ]; files.Read(imgByte,0, imgByte.Length); files.Close(); return imgByte; } |
第 3 条附言 · 6 月前
还有一种方法,使用CustomUnboundColumnData事件
1. 创建了一个非绑定列并设置其相应的属性,属性设置如下:
FieldName设为Image (该字段名必须是唯一的) UnboundType设为 UnboundColumnType.Object
ColumnEdit设为RepositoryItemPictureEdit类的实例(该操作PictureEdit 为该列的内置编辑器)
2. 处理View的CustomUnboundColumnData事件,用于为非绑定列填充数据。
在该事件中需加载图片,将其存放在一个hashtable中,然后再将其提供给对应
的单元格。
关键代码:
//获取文件路径
string
GetFileName(
string
color) {
if
(color ==
null
||color ==
string
.Empty)
return
string
.Empty;
return
color +
".jpg"
;
}
//处理CustomUnboundColumnData事件,为非绑定列填充数据
private
void
gridView1_CustomUnboundColumnData(
object
sender,
DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e)
{
if
(e.Column.FieldName ==
"Image"
&& e.IsGetData) {
GridView view = sender
as
GridView;
string
colorName = (
string
)((DataRowView)e.Row)[
"Color"
];
string
fileName = GetFileName(colorName).ToLower();
if
(!Images.ContainsKey(fileName))
{
Image img =
null
;
try
{
string
filePath = DevExpress.Utils.FilesHelper.FindingFileName(Application.StartupPath, ImageDir+ fileName,
false
);
img = Image.FromFile(filePath);
}
catch
{ }
Images.Add(fileName, img);
}
e.Value = Images[fileName];
}
}