jjzjj

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

温故知新 2023-03-28 原文

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

 

 

 

 

 

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

 

 

 

 绑定图片代码如下:

DataTable dtOutline = new DataTable("OutLine");
dtOutline.Columns.Add("outline", typeof(string));
dtOutline.Columns.Add("outline_pic", typeof(Image));
dtOutline.Columns.Add("cutspeed_min", typeof(float));
dtOutline.Columns.Add("cutspeed_max", typeof(float));
dtOutline.Columns.Add("cnt", typeof(float));

dtOutline.Rows.Add("", Properties.Resources.outline1, 200, 250, 100);
dtOutline.Rows.Add("", Properties.Resources.outline2, 100, 120, 60);
dtOutline.Rows.Add("", Properties.Resources.outline3, 150, 180, 100);
dtOutline.Rows.Add("", Properties.Resources.outline4, 100, 120, 100);
dgcOutline.DataSource = dtOutline;

编辑时,只需要点击鼠标右键--调用即可选择图片,由于本项目保存是将表格里的数据存入本地.ini文件,因此我的方法是获取到PictureEdit里的图片然后存到本地的一个文件夹中,然后再将文件的路径存入.ini文件,下次打开界面时先读取.ini文件下对应的图片路径,再绑定到控件,之所以这么做是因为貌似PictureEdit无法像WEB端图片控件一样直接获取绑定的图片路径(如果大家知道怎么获取也可以留言告知)。

//保存图片到文件夹 
Bitmap outlinePic = null;
if (dt.Rows[i]["outline_pic"] != DBNull.Value)
outlinePic = (Bitmap)dt.Rows[i]["outline_pic"];
string picName = "";
if (outlinePic != null)
{
  picName = $@"{Application.StartupPath}\Database\Files\CraftRecipe\outlinepic.png";
  outlinePic.Save(picName);
}
//将图片路径存入ini以便读取图片并绑定 INI操作方法不再赘述自行实现
DesignSettings.INI.SetValue(sec, "outline_pic", outline_pic);

这里有一点要注意,假如选择的文件不是png格式,采用以上方式保存的图片是无法正常打开的,可以限制PictureEdit文件选择框的类型,在OpenFileDialogFilter输入:图片文件(*.png)|*.png即可,如图:

 

 

 

读取时不要使用Image.FromFile()的方式,该方法会使图片文件被占用,当我们更换了图片想要保存表格数据时,会报错,这里采用Image.FromStream()从流中绑定得以解决

public byte[] GetImageByte(String path)
{
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        BinaryReader br = new BinaryReader(fs);
        byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读入到字节数组中
        return imgBytesIn;
    }
}                
  
DataTable dtOutline = new DataTable("dtOutline");
dtOutline.Columns.Add("outline", typeof(string));
dtOutline.Columns.Add("outline_pic", typeof(Image));
dtOutline.Columns.Add("cutspeed_min", typeof(float));
dtOutline.Columns.Add("cutspeed_max", typeof(float));
dtOutline.Columns.Add("cnt", typeof(float));
string outline_pic = DesignSettings.INI.GetValue(sec, "outline_pic");
Image img = null;
if (!string.IsNullOrEmpty(outline_pic))
{
  if (File.Exists(outline_pic))
  {
    using (MemoryStream ms = new MemoryStream(GetImageByte(outline_pic)))
    {
      img = Image.FromStream(ms);
    }
  }
}
dtOutline.Rows.Add(outline, img, cutspeed_min, cutspeed_max, cnt);
dgcOutline.DataSource = dtOutline;

 

有关DevExpress GridControl图片列,图片绑定与编辑保存的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  4. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  5. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  6. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  7. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  8. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","

  9. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  10. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

随机推荐