zoukankan      html  css  js  c++  java
  • 在DevExpress GridControl的一列中显示图片

            作者:jiankunking 出处:http://blog.csdn.net/jiankunking

            近期做项目的时候用到了将GridControl中一列设置为PictureEdit类型,然后通过这一列来显示图片。经过尝试发现有下面两种方式可行。

    方法一、知道图片的路径与名称

            比方:在数据库中存储了图片的路径(包含:本地路径、server路径),那么在能够通过非绑定列的方式来实现。

    1、创建了一个非绑定列并设置其对应的属性。属性设置例如以下:
            FieldName设为 Photo(该字段名必须是唯一的)


            UnboundType设为 UnboundColumnType.Object
            ColumnEdit设为RepositoryItemPictureEdit类的实例(该操作PictureEdit 为该列的内置编辑器)


            2.、加入GridView的CustomUnboundColumnData事件。用于为非绑定列填充数据。


            既然已经设置完毕了。那么详细的代码怎么编写呢?详细代码例如以下:

       private void gridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e)
            {
                if (e.Column.FieldName == "Photo" && e.IsGetData)
                {
                    //RefImage是存储图片路径的那一列
                    string filePath = (string)((DataRowView)e.Row)["RefImage"];
                    Image img = null;
                    try
                    {
                        //推断图片路径是否为网络路径
                        if (UrlDiscern(filePath))
                        {
                            //文件是否存在
                            if (RemoteFileExists(filePath))
                            {
                                //读取文件
                                using (WebClient wc = new WebClient())
                                {
                                    img = new Bitmap(wc.OpenRead(filePath));
                                }
                            }
                        }
                        // 推断本地文件是否存在
                        else if (LocalFileExists(filePath))
                        {
                            //载入本地图片
                            img = Image.FromFile(filePath);
                        }
                        //pictureEdit列绑定图片
                        e.Value = img;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
            /// <summary>
            /// 推断远程文件是否存在
            /// </summary>
            /// <param name="fileUrl"></param>
            /// <returns></returns>
            public bool RemoteFileExists(string fileUrl)
            {
                HttpWebRequest re = null;
                HttpWebResponse res = null;
                try
                {
                    re = (HttpWebRequest)WebRequest.Create(fileUrl);
                    res = (HttpWebResponse)re.GetResponse();
                    if (res.ContentLength != 0)
                    {
                        //MessageBox.Show("文件存在");
                        return true;
                    }
                }
                catch (Exception)
                {
                    //MessageBox.Show("无此文件");
                    return false;
                }
                finally
                {
                    if (re != null)
                    {
                        re.Abort();//销毁关闭连接
                    }
                    if (res != null)
                    {
                        res.Close();//销毁关闭响应
                    }
                }
                return false;
            }
            /// <summary>
            /// 推断本地文件是否存在
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            public bool LocalFileExists(string filePath)
            {
                if (File.Exists(filePath))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            /// <summary>
            /// 识别urlStr是否是网络路径
            /// </summary>
            /// <param name="urlStr"></param>
            /// <returns></returns>
            public bool UrlDiscern(string urlStr)
            {
                if (Regex.IsMatch(urlStr, @"((http|ftp|https)://)(([a-zA-Z0-9._-]+.[a-zA-Z]{2,6})|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9&%_./-~-]*)?"))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

    假设图片在单元格中显示有问题的话,能够调整  


    方法二、知道图片的路径与名称

            除了方法一之外,我们还能够使用流的方式的来载入图片,即依据图片路径将图片转化为流。然后直接绑定到RepositoryItemPictureEdit列上就可以。

    此时不须要改动列的绑定类型。仅仅须要该列的FieldName与数据源中的byte[]流的所在列的名称一致就可以,

            假设这么绑定无效的话,能够在gridcontrol的数据源(此处假设为Dataset)中新增一列

     ds.Tables[0].Columns.Add("Photo", System.Type.GetType("System.Byte[]"));
            然后,依据路径载入图片到Photo列中,

     <pre name="code" class="html">  byte[] bb = PubFunc.getImageByte(path, webClient);
      ds.Tables[0].Rows[i]["Photo"] = bb;

         当中,可能会用到的函数例如以下:
    /// <summary>
            /// 返回图片的字节流byte[]
            /// </summary>
            /// <param name="imagePath"></param>
            /// <param name="webClient"></param>
            /// <returns></returns>
            public byte[] getImageByte(string imagePath)
            {
                byte[] imgByte = null;
                try
                {
                    if (UrlDiscern(imagePath))
                    {
    					using(WebClient webClient=new WebClient())
    					{
                             Bitmap bt = new Bitmap(webClient.OpenRead(imagePath));
                             imgByte = PubFunc.ImgToByte(bt);
    					}
                    }
                    else
                    {
                        using (FileStream files = new FileStream(imagePath, FileMode.Open))
                        {
                            imgByte = new byte[files.Length];
                            files.Read(imgByte, 0, imgByte.Length);
                            files.Close();
                        }
                    }
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.ToString());
                }
                return imgByte;
            }
     /// <summary>
            /// 图片转换成字节流
            /// </summary>
            /// <param name="img">要转换的Image对象</param>
            /// <returns>转换后返回的字节流</returns>
            public byte[] ImgToByte(Image img)
            {
                try
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        byte[] imagedata = null;
                        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        imagedata = ms.GetBuffer();
                        return imagedata;
                    }
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.ToString());
                    return null;
                }
            }

    小注:

    使用以上方法,高速滑动滑动条的时候,会出现卡死的现象,由于上述代码是每次实时读取图片资源的。应该加入一个图片路径、图片 字典,以降低图片的反复读取。

     private void gridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e)
            {
                if (e.Column.FieldName == "Photo" && e.IsGetData)
                {
                    string filePath = (string)((DataRowView)e.Row)["RefImage"];
                    if (!images.ContainsKey(filePath))
                    {
                        Image img = null;
                        try
                        {
                            if (PubFunc.UrlDiscern(filePath))
                            {
                                if (FileUpDownload.RemoteFileExists(filePath))
                                {
                                    using (WebClient wc = new WebClient())
                                    {
                                        //Bitmap bmtemp = new Bitmap(wc.OpenRead(filePath));
                                        //img = new Bitmap(bmtemp, 75, 75);
                                        img = new Bitmap(wc.OpenRead(filePath));
                                    }
                                }
                            }
                            else if (PubFunc.LocalFileExists(filePath))
                            {
                                img = Image.FromFile(filePath);
                            }
                            images.Add(filePath, img);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                    e.Value = images[filePath];
                }
            }




  • 相关阅读:
    Centos7安装Redis-单节点
    解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题
    做销售如何跟单,逼单!共20招!(转)
    销售沟通技巧(转)
    rails gem (2015-07-16)
    Foundation
    Redis TTL 为0
    Introspection反射机制
    will_paginate
    Linux下Rsync+Inotify-tools实现数据实时同步
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7147832.html
Copyright © 2011-2022 走看看