DEV GridControl图片列,图片绑定与编辑保存

打印 上一主题 下一主题

主题 526|帖子 526|积分 1578

需求如下,在DEV框架项目中,需要在表格中增加一列显示图片,并且能编辑该列图片,然后进行保存等操作,最终效果如下

 

 
 
 
 
 这里使用的是PictureEdit控件来实现,打开DEV GridControl设计器,在ColumnEdit选择PictureEdit:

 
 
 
 绑定图片代码如下:
  1. DataTable dtOutline = new DataTable("OutLine");
  2. dtOutline.Columns.Add("outline", typeof(string));
  3. dtOutline.Columns.Add("outline_pic", typeof(Image));
  4. dtOutline.Columns.Add("cutspeed_min", typeof(float));
  5. dtOutline.Columns.Add("cutspeed_max", typeof(float));
  6. dtOutline.Columns.Add("cnt", typeof(float));
  7. dtOutline.Rows.Add("", Properties.Resources.outline1, 200, 250, 100);
  8. dtOutline.Rows.Add("", Properties.Resources.outline2, 100, 120, 60);
  9. dtOutline.Rows.Add("", Properties.Resources.outline3, 150, 180, 100);
  10. dtOutline.Rows.Add("", Properties.Resources.outline4, 100, 120, 100);
  11. dgcOutline.DataSource = dtOutline;
复制代码
编辑时,只需要点击鼠标右键--调用即可选择图片,由于本项目保存是将表格里的数据存入本地.ini文件,因此我的方法是获取到PictureEdit里的图片然后存到本地的一个文件夹中,然后再将文件的路径存入.ini文件,下次打开界面时先读取.ini文件下对应的图片路径,再绑定到控件,之所以这么做是因为貌似PictureEdit无法像WEB端图片控件一样直接获取绑定的图片路径(如果大家知道怎么获取也可以留言告知)。
  1. //保存图片到文件夹
  2. Bitmap outlinePic = null;
  3. if (dt.Rows[i]["outline_pic"] != DBNull.Value)
  4. outlinePic = (Bitmap)dt.Rows[i]["outline_pic"];
  5. string picName = "";
  6. if (outlinePic != null)
  7. {
  8.   picName = $@"{Application.StartupPath}\Database\Files\CraftRecipe\outlinepic.png";
  9.   outlinePic.Save(picName);
  10. }
  11. //将图片路径存入ini以便读取图片并绑定 INI操作方法不再赘述自行实现
  12. DesignSettings.INI.SetValue(sec, "outline_pic", outline_pic);
复制代码
这里有一点要注意,假如选择的文件不是png格式,采用以上方式保存的图片是无法正常打开的,可以限制PictureEdit文件选择框的类型,在OpenFileDialogFilter输入:图片文件(*.png)|*.png即可,如图:

 
 
 
读取时不要使用Image.FromFile()的方式,该方法会使图片文件被占用,当我们更换了图片想要保存表格数据时,会报错,这里采用Image.FromStream()从流中绑定得以解决
  1. public byte[] GetImageByte(String path)
  2. {
  3.     using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
  4.     {
  5.         BinaryReader br = new BinaryReader(fs);
  6.         byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读入到字节数组中
  7.         return imgBytesIn;
  8.     }
  9. }               
复制代码
  1.   
  2. DataTable dtOutline = new DataTable("dtOutline");
  3. dtOutline.Columns.Add("outline", typeof(string));
  4. dtOutline.Columns.Add("outline_pic", typeof(Image));
  5. dtOutline.Columns.Add("cutspeed_min", typeof(float));
  6. dtOutline.Columns.Add("cutspeed_max", typeof(float));
  7. dtOutline.Columns.Add("cnt", typeof(float));
  8. string outline_pic = DesignSettings.INI.GetValue(sec, "outline_pic");
  9. Image img = null;
  10. if (!string.IsNullOrEmpty(outline_pic))
  11. {
  12.   if (File.Exists(outline_pic))
  13.   {
  14.     using (MemoryStream ms = new MemoryStream(GetImageByte(outline_pic)))
  15.     {
  16.       img = Image.FromStream(ms);
  17.     }
  18.   }
  19. }
  20. dtOutline.Rows.Add(outline, img, cutspeed_min, cutspeed_max, cnt);
  21. dgcOutline.DataSource = dtOutline;
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表