如何在GridControl中顯示圖片列?控件DevExpress.XtraGrid.GridControl中顯示圖片列。


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;
}

使用這種方法時遇到問題就是圖片一直無法顯示在列表中,並且檢查GridControl所有屬性后仍然未找到解決方案:

最后解決方案如下:

Image xx=Image.FromFile("xxx"),yy=Image.FromFile("yyy");
dt.Columns.Add("img", Type.GetType("System.Byte[]"));
foreach(DataRow dr in dt.Rows)
{
    if(dr["imgflag"].ToString()=="1")
        dr["img"]=ImageToBytes(xx);
    else dr["img"]=ImageToBytes(yy);
}

 

public static byte[] ImageToBytes(Image image)
        {
            ImageFormat format = image.RawFormat;
            using (MemoryStream ms = new MemoryStream())
            {
                if (format.Equals(ImageFormat.Jpeg))
                {
                    image.Save(ms, ImageFormat.Jpeg);
                }
                else if (format.Equals(ImageFormat.Png))
                {
                    image.Save(ms, ImageFormat.Png);
                }
                else if (format.Equals(ImageFormat.Bmp))
                {
                    image.Save(ms, ImageFormat.Bmp);
                }
                else if (format.Equals(ImageFormat.Gif))
                {
                    image.Save(ms, ImageFormat.Gif);
                }
                else if (format.Equals(ImageFormat.Icon))
                {
                    image.Save(ms, ImageFormat.Icon);
                }
                byte[] buffer = new byte[ms.Length];
                //Image.Save()會改變MemoryStream的Position,需要重新Seek到Begin
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(buffer, 0, buffer.Length);
                return buffer;
            }
        }

在DataTable列中添加圖片列的時候需要制定數據類型。

 

然后設置 gridcontrol1.DataSource=dt; 完成。
 

上一篇介紹的是直接使用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;
 
}

 

還有一種方法,使用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];
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM