这几天我在做一个小项目,其中涉及到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.实体类设计:
字段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了。
不知道我这种方法是否合理,敬请大虾指教!没分了,只是分享。
解决方案 »
- C# Linq查询的问题
- 使用Jmail组件为什么不能连接到gmail邮箱
- [急]HttpWebRequest.CookieContainer 出现错误!!
- 取值问题?
- 请问如果设置DataGrid(win form)中指定单元格的背景色??
- 调用远程数据库应该怎样弄?
- CSDN 新加入了使用 Google , QQ, GitHut等账号登陆的功能,请问是怎样实现的呢?有Sample么?
- 哪位大侠知道iphlpapi.dll???
- 简单问题高分求教!如何将richTextBox中的数据取出?
- 请大家谈谈,怎样做电脑专业才最有出路?路在何方?是不是学习和工作狂人才可做电脑?
- socket 为什么发送第一次成功 第二次 不成功呢???
- 关于使用DataSet中datatable的Schema动态设定
//插入图片到数据库
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对象
*/