在GridControl控件上绑定图片的几种操作方式详解

我们知道,基于DevExpress的开发Winform的项目界面的时候,GridControl控件是经常用来绑定数据的,一般以常规的字符内容为主,有时候也会有图片的显示需要,那么如果显示图片,我们应该如何实现呢?本篇随笔介绍基于原生GridControl控件的图片绑定显示操作和基于我封装的分页控件(封装GridControl的分页控件)两种图片绑定显示的操作。

1、基于原生的GridControl控件图片绑定

绑定图片,一般我们可以在单元格里面绑定byte[]类型或者Image类型,那么控件就会自动显示图片出来,当然我们也可以自定义对图片路径转换为图片然后显示的,不过就是额外需要增加一些处理而已。

本例子针对这三种方式分别进行介绍,图片的绑定操作。

为了方便演示,我们创建一个菜单对象类,然后构建一些数据用于列表的绑定操作,如下代码所示。

/// <summary>
  /// 模拟一个菜单的对象,包括各种类型的图片信息
  /// </summary>
  public class MenuInfo
  {
    /// <summary>
    /// 编号
    /// </summary>
    public string ID { get; set; }

    /// <summary>
    /// 图标名称
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 图片路径
    /// </summary>
    public string ImageFilePath {get;set;}

    /// <summary>
    /// 图标字节
    /// </summary>
    public virtual byte[] EmbedIcon { get; set; }

    /// <summary>
    /// 图标图片对象
    /// </summary>
    public Image ImageIcon { get; set; }

    /// <summary>
    /// 构造函数
    /// 为了展示的方便,在构造函数里面构造相应的数据
    /// </summary>
    public MenuInfo()
    {
      this.ID = Guid.NewGuid().ToString();
      this.Name = "测试图片菜单";
      this.ImageFilePath = Path.Combine(System.Environment.CurrentDirectory, "app.ico");
      if (File.Exists(this.ImageFilePath))
      {
        this.EmbedIcon = FileUtil.FileToBytes(this.ImageFilePath);
        this.ImageIcon = ImageHelper.ImageFromUrl(this.ImageFilePath);
      }
    }

创建GridColumn的时候,我们可以利用GridVIew的扩展函数CreateColumn进行创建几个不同的列,如下代码所示。

public partial class FrmRepositoryItemImageEdit : BaseForm
  {
    public FrmRepositoryItemImageEdit()
    {
      InitializeComponent();

      CreateGridView();
    }

    /// <summary>
    /// 创建gridView1列表所需显示的列
    /// </summary>
    private void CreateGridView()
    {
      //创建一个隐藏的ID列
      this.gridView1.CreateColumn("ID", "ID").Visible = false;
      //串一个名称的列,并指定宽度
      this.gridView1.CreateColumn("Name", "名称", 150);

      //创建一个图片路径的列,并指定它的编辑控件类型为RepositoryItemImageEdit
      //并为这个列实现ParseEditValue的方法,用于解析路径为具体的图片显示
      this.gridView1.CreateColumn("ImageFilePath", "图片路径绑定", 100).CreateImageEdit().ParseEditValue += (s, e) =>
      {
        if (e.Value != null && e.Value is string && e.Value.ToString() != string.Empty)
        {
          e.Value = Image.FromFile(string.Concat(e.Value));
          e.Handled = true;
        }
      };

      //创建图片字节的列,用于显示图片
      this.gridView1.CreateColumn("EmbedIcon", "图片字节绑定", 100);
      //创建图片对象的列,用于显示图片
      this.gridView1.CreateColumn("ImageIcon", "图片对象绑定", 100);
    }

上面代码是创建GridView所需要显示的列信息,那么我们准备好数据源绑定到列表控件上就可以了,如下代码所示。

/// <summary>
/// 绑定列表数据
/// </summary>
private void BindData()

{
  //构造只有一个记录的集合
  List<MenuInfo> menuList = new List<MenuInfo>()
  {
    new MenuInfo()
  };
  //绑定数据源到列表控件上
  this.gridControl1.DataSource = menuList;
} 

2、基于分页控件的图片绑定

很多时候,我们需要对数据库的数据进行分页显示,以提高显示的速度和效率,那么利用分页控件就可以获得很多这样统一的界面和高效率显示数据的好处,基于分页控件的处理本质上和上面的过程差不多,不过处理的代码需要变化一下,从而可以正常的实现图片绑定显示操作。

/// <summary>
  /// 基于分页控件的图片显示案例
  /// </summary>
  public partial class FrmRepositoryItemImageEdit2 : BaseForm
  {
    public FrmRepositoryItemImageEdit2()
    {
      InitializeComponent();

      CreateGridView();
    }

    /// <summary>
    /// 创建gridView1列表所需显示的列
    /// </summary>
    private void CreateGridView()
    {
      this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
      this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
      this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
      this.winGridViewPager1.ShowLineNumber = true;
      this.winGridViewPager1.BestFitColumnWith = false;//是否设置为自动调整宽度,false为不设置
      this.winGridViewPager1.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged);
    }

    /// <summary>
    /// 绑定数据后,分配各列的宽度
    /// </summary>
    private void gridView1_DataSourceChanged(object sender, EventArgs e)
    {
      //对图片路径的列,重新使用RepositoryItemPictureEdit类型
      //然后对该列的控件的ParseEditValue和FormatEditValue函数进行实现,从而实现路径到图片的显示
      var edit = this.winGridViewPager1.gridView1.Columns.ColumnByFieldName("ImageFilePath").CreatePictureEdit();
      edit.ParseEditValue += (s, se) =>
      {
        if (se.Value != null && se.Value.GetType() == typeof(string) && se.Value.ToString() != string.Empty)
        {
          if (File.Exists(string.Concat(se.Value)))
          {
            var picture = ImageHelper.ImageFromUrl(string.Concat(se.Value));
            se.Value = picture;
            se.Handled = true;

          }
        }
      };
      edit.FormatEditValue += (s, se) =>
      {
        if (File.Exists(string.Concat(se.Value)))
        {
          var picture = ImageHelper.ImageFromUrl(string.Concat(se.Value));
          se.Value = picture;
          se.Handled = true;
        }
      };

      if (this.winGridViewPager1.gridView1.Columns.Count > 0 && this.winGridViewPager1.gridView1.RowCount > 0)
      {
        //统一设置100宽度
        foreach (DevExpress.XtraGrid.Columns.GridColumn column in this.winGridViewPager1.gridView1.Columns)
        {
          column.Width = 120;
        }

        //可特殊设置特别的宽度
        GridView gridView = this.winGridViewPager1.gridView1;
        if (gridView != null)
        {
          //gridView.SetGridColumWidth("Note", 200);
        }
      }
    }

而在分页控件的数据绑定的时候,我们指定列名的中文名即可,如下代码所示

/// <summary>
    /// 绑定列表数据
    /// </summary>
    private void BindData()
    {
      #region 添加别名解析

      this.winGridViewPager1.DisplayColumns = "Name,ImageFilePath,EmbedIcon,ImageIcon";
      this.winGridViewPager1.AddColumnAlias("ID", "编号");
      this.winGridViewPager1.AddColumnAlias("Name", "名称");
      this.winGridViewPager1.AddColumnAlias("ImageFilePath", "图片路径绑定");
      this.winGridViewPager1.AddColumnAlias("EmbedIcon", "图片字节绑定");
      this.winGridViewPager1.AddColumnAlias("ImageIcon", "图片对象绑定");

      this.winGridViewPager1.gridView1.OptionsBehavior.Editable = true;
      this.winGridViewPager1.gridView1.OptionsBehavior.ReadOnly = false;

      #endregion

      //构造只有一个记录的集合
      List<MenuInfo> menuList = new List<MenuInfo>()
      {
        new MenuInfo()
      };

      this.winGridViewPager1.DataSource = menuList;
    }

以上就是基于GridControl控件上绑定图片的几种操作方式,方便我们在项目中参考使用。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • DevExpress实现GridControl根据列选中一行

    本文实例形式展示了DevExpress实现GridControl根据列选中一行的方法,比较实用的功能,希望能对大家进行项目开发起到一定的借鉴与帮助作用.具体方法如下: 主要功能代码如下: /// <summary> /// 根据列来选中一行 /// </summary> /// <param name="gridView">GridView</param> /// <param name="colName">

  • DevExpress实现GridControl单元格编辑验证的方法

    本文实例演示了DevExpress实现GridControl单元格编辑验证的方法,比较实用的功能,具体方法如下: 主要功能代码如下: /// <summary> /// 自定义单元格验证 /// </summary> /// <param name="view">GridView</param> /// <param name="e">BaseContainerValidateEditorEventArgs

  • DevExpress实现GridControl删除所有行的方法

    本文实例讲述了DevExpress实现GridControl删除所有行的方法,希望对读者进行C#程序设计有一定的帮助,具体方法如下: 主要功能代码如下: /// <summary> /// 删除全部行 /// </summary> /// <param name="gridView">GridView</param> public static void ClearRows(this GridView gridView) { bool _

  • DevExpress中GridControl列转义的实现方法

    在一些项目的实际开发过程中,我们有时候需要对GridControl中列值进行转义,譬如1转义成"完成"等等,一般在诸如CustomColumnDisplayText事件中能够轻松完成,为了提高代码复用性,所以需要对CustomColumnDisplayText进行包装.具体方法如下: 主要功能代码如下: /// <summary> /// CustomColumnDisplayText Helper /// </summary> /// <param na

  • DevExpress实现GridControl同步列头checkbox与列中checkbox状态

    本文实例展示了DevExpress实现GridControl同步列头checkbox与列中checkbox状态的方法,有一定的实用价值,具体方法如下: 主要功能代码如下: /// <summary> /// 同步列头checkbox与列中checkbox状态 /// </summary> /// <param name="view">GridView</param> /// <param name="fieldeName&

  • DevExpress实现GridControl显示Gif动画的方法

    本文讲述了DevExpress实现GridControl显示Gif动画的方法,是进行C#应用开发中比较重要的功能,具体实现方法如下: 一般来说,如果没有对其进行相关设置,那么GridControl列中gif在编辑状态下,才能显示动画效果,如果要设置列自动显示动画效果,可以进行如下图所示设置: 调用代码如下: gridView.OptionsView.AnimationType== GridAnimationType.AnimateAllContent; 希望本文所述方法能够对读者进行C#项目开发

  • DevExpress实现GridControl列头绘制Checkbox的方法

    本文实例展示了DevExpress实现GridControl列头绘制Checkbox的方法,具体实现方法如下: 主要功能代码如下: /// <summary> /// 为列头绘制CheckBox /// </summary> /// <param name="view">GridView</param> /// <param name="checkItem">RepositoryItemCheckEdit&

  • DevExpress实现自定义GridControl中按钮文字内容的方法

    在一些C#项目的开发中,有时候会使用到GridControl的FindPanel,这样可以很好的对数据进行筛选,可是所展现的按钮文字是英文,如下图所示: 那怎么定义两个按钮问题,以符合项目需求了?本文讲述利用GridLocalizer来实现这一要求的方法.具体步骤如下: 主要功能代码如下: public class BuilderGridLocalizer : GridLocalizer { Dictionary<GridStringId, string> CusLocalizedKeyVal

  • 在GridControl控件上绑定图片的几种操作方式详解

    我们知道,基于DevExpress的开发Winform的项目界面的时候,GridControl控件是经常用来绑定数据的,一般以常规的字符内容为主,有时候也会有图片的显示需要,那么如果显示图片,我们应该如何实现呢?本篇随笔介绍基于原生GridControl控件的图片绑定显示操作和基于我封装的分页控件(封装GridControl的分页控件)两种图片绑定显示的操作. 1.基于原生的GridControl控件图片绑定 绑定图片,一般我们可以在单元格里面绑定byte[]类型或者Image类型,那么控件就会

  • WPF实现在控件上显示Loading等待动画的方法详解

    WPF 如何在控件上显示 Loading 等待动画 框架使用.NET40: Visual Studio 2022; 使用方式需引入命名空间后设置控件的附加属性 wd:Loading.IsShow="true",即可显示默认等待动画效果如下: 如需自定义 Loading 一定要 先设置 wd:Loading.Child 在设置 IsShow="true" . 显示不同 Loading 内容需 wd:Loading.Child ={x:Static wd:NormalL

  • Java Swing实现窗体添加背景图片的2种方法详解

    本文实例讲述了Java Swing实现窗体添加背景图片的2种方法.分享给大家供大家参考,具体如下: 在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1. 利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体.这是一个很取巧的办法,代码非常简单,如下所示. JLabel lbBg = new JLabel(imageIcon); lbBg.setBound

  • 在Android TextView中显示图片的4种方式详解

    我们知道,TextView控件一般是用来显示文本的,而图片一般是用ImageView控件来显示. 那TextView能否显示图片呢?答案是肯定的!下面列出常见的4种方式. 1.XML文件中指定属性值 这种方式应该是最常用的了,在TextView的左上右下显示图片,可用  android:drawableLeft  android:drawableTop  android:drawableRight  android:drawableBottom 比如我们要在TextView的顶部设置图片,代码如

  • 实现onmouseover和onmouseout应用于RadioButtonList或CheckBoxList控件上

    一直想实现onmouseover和onmouseout应用于RadioButtonList或CheckBoxList控件上,今晚终于有时间实现它.此功能就是当鼠标经过时RadioButtonList或CheckBoxList每一个Item时,让Item有特效显示,离开时,恢复原样.可以看到效果: RadioButtonList效果: CheckBoxList效果: 这资实现数据,Insus.NET准备了五行(Five Phases) 创建一个对象[Five Phases]:FivePhases.

  • C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    本文实例讲述了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法.分享给大家供大家参考,具体如下: 在Winform中如果将一个透明图片放在窗体上能正常显示透明,但是如果将该图片放在另一个控件上会导致不能显示透明效果. 解决这种情况,可以采取在控件上使用GDI+绘画出透明图片. 这里我们就以一个pictureBox2控件上面重叠一张png透明图片为例: 我们只需要给pictureBox2控件添加Paint事件,然后对png透明图片进行绘制即可,代码如下: private voi

  • C# WPF Image控件的绑定方法

    在我们平时的开发中会经常用到Image控件,通过设置Image控件的Source属性,我们可以加载图片,设置Image的source属性时可以使用相对路径也可以使用绝对路径,一般情况下建议使用绝对路径,类似于下面的形式Source="/Demo;Component/Images/Test.jpg"其中Demo表示工程的名称,后面表示具体哪个文件夹下面的哪个图片资源,在程序中,我们甚至可以为Image控件设置X:Name属性,在后台代码中动态去改变Image的Source,但我个人认为这

  • asp.net fileupload控件上传文件与多文件上传

    1.前台文件 Default.aspx: <%@ Page Language="C#" AutoEventWireup="true"CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

  • JavaScript判断FileUpload控件上传文件类型

    为了代码变得更加简捷,笔者使用了正则表达式来获取文件扩展名,如果读者对正则表达式不太了解或者从来没有接触过,请马上恶补一下吧!毕竟它非常重要,大多数的编程语言都支持正则表达式. 大家都知道,后台获取FileUpload扩展名方法: string ext = Path.GetExtension(fu.PostedFile.FileName); JS判断FileUpload控件上传文件的扩展名: <html xmlns="http://www.w3.org/1999/xhtml"&g

  • JavaScript在控件上添加倒计时功能的实现代码

    一.概述 在有些 报表 需求中,需要为控件添加倒计时功能,限制到某一个时间点后能进行一项操作或不能进行某项操作,比如查询,导出功能等等,又需要人性化地显示还有多少时间,即倒计时功能,比如下图中我们限制这个报表在每天10点后才能查询 当倒计时结束的时候,查询功能可用 这种功能如何实现的呢 二.实现思路 主要原理是利用控件的setEnable(true)/setEnable(false)来进行设置控件的可用与不可用状态,在获取时间的过程中,需要利用到JS中的获取时间,利用JS的定时器函数setInt

随机推荐