这几天我在做一个小项目,其中涉及到DataGridView显示图片问题,都知道数据库image类型存的是禁制数。如二进制,8进制,16进制。我做法如下,虽然自我感觉不太好,但实现了此功能。
1.实体类设计:
字段ID int  UserPhoto byte[]  Photo Image这个需要引用using System.Drawing;
注:数据库中只有userPhoto这个列不需要Photo这个列。
2.数据访问层,不需要对Photo这个字段进行增删改,就当做没有这个字段。如果用代码生成器的,可以考虑先不在类中写入Photo这个字段,生成后在写入。
3.最好写个ImageHelper类,我写的如下:
/// <summary>
        /// 将byte[]类型转换为Image类型
        /// </summary>
        /// <param name="arr"></param>
        /// <returns></returns>
        public static Image ByteToImage(byte[] arr) 
        {
            Image image = null;
            if (arr != null)
            {
                MemoryStream mymemorystream = new MemoryStream(arr, 0, arr.Length);
                image = Image.FromStream(mymemorystream);
            }
            return image;
        }        /// <summary>
        /// 将Image类型转换为byte[]类型
        /// </summary>
        /// <param name="pic"></param>
        /// <returns></returns>
        public static byte[] ImageToByte(Image image)
        {
            if (image != null)
            {
                MemoryStream ms = new MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();
                return arr;
            }
            else
            {
                return null;
            }
        }当需要在页面展示图片时,我的做法是这样,先查询出想要的列表放到list
循环此list 
 List<UserInfo> _list = new List<UserInfo>();//新建list
            foreach (UserInfo user in list)
            {                
                UserInfo _user = new UserInfo();
                _user.ID = user.ID;
                _user.Photo = ImageHelper.ByteToImage(user.UserPhoto);
                _list.Add(personList);
            }
            this.dgvInternalList.DataSource = _list;我在DataGridView里绑定的列明是在右上角有个三角块,点进去选择编辑列,照片类型为DataGridViewImageColumn把列名写上,就OK了。
不知道我这种方法是否合理,敬请大虾指教!没分了,只是分享。

解决方案 »

  1.   

    datagridview 不是有image列么?我数据表存2进制的图片,直接取表绑定到datagridview也可以呀,何必这么复杂
      

  2.   

    不可以。我试过了,只会显示System.Byte[]这个类。
      

  3.   


                        //插入图片到数据库
                        cmd.Parameters.Add("@fullpic", MySqlDbType.LongBlob);
                        cmd.Parameters.Add("@smallpic", MySqlDbType.LongBlob);
                        foreach (DictionaryEntry de in FullpicMap)
                        {
                            int sort = Convert.ToInt32(de.Key);
                            byte[] FullPic = (byte[])de.Value;
                            string FullPicSql = string.Format("insert into ProductPic (ProductID,ContentFull,ContentSmall,Sort) values({0},@fullpic,@smallpic,{1})", productID,sort);
                            cmd.CommandText = FullPicSql;
                            cmd.Parameters["@fullpic"].Value = FullPic;
                            cmd.Parameters["@smallpic"].Value = (byte[])Utils.getHashtableValue(SmallpicMap, sort);
                            count += cmd.ExecuteNonQuery();
                        }
           
            //取数据
            public DataSet SelectProductList(string SqlQuery, string LimitNum = "0,25")
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("select a.ID AS ProductID,a.NameCode,a.Name_cn,a.Name_en,p.ContentSmall,a.BarCode,c.ProviderCode,c.ID,c.Price,c.ProviderID,");
                sb.Append("a.ProductID_emax,a.ProductID_synaps,a.NewLevel,a.Information,a.Status,a.HighPrice,c.IsDefaultProvider,d.ChannelNum FROM ProductInfo a ");
                sb.Append("left JOIN (SELECT ProductID,ContentSmall FROM ProductPic where Sort = 1) as p ON a.ID = p.ProductID " );
                sb.Append("left JOIN ProductProvider c on a.ID = c.ProductID ");
                sb.Append("left join (select ProductID,COUNT(*) as ChannelNum from Channel_Product_Mapping GROUP BY ProductID) d on a.ID = d.ProductID ");
                sb.Append("where 1 = 1 " + SqlQuery + " GROUP BY a.ID ORDER BY a.ID DESC LIMIT " + LimitNum);
                return DbHelperSQL.Query(sb.ToString());        }
                //数据绑定
                ProductMgr productMgr = new ProductMgr();
                DataSet ds = productMgr.SelectProductList(SqlQuery: null);
                dataGridView1.DataSource = ds.Tables[0];
                DataCount = productMgr.QueryCount();
                label6.Text = string.Format("当前第{0}页/共{1}页/共{2}条商品", (DataPage + 1).ToString(), (DataCount-1) / 25 + 1,DataCount);
    /*
     *我是这样实现,完全可以。
     *但是单独取图片出来 还是得把2进制转成image对象
     */