在GridControl控制項上綁定圖片的幾種操作方式

来源:https://www.cnblogs.com/wuhuacong/archive/2018/06/06/9145765.html
-Advertisement-
Play Games

我們知道,基於DevExpress的開發Winform的項目界面的時候,GridControl控制項是經常用來綁定數據的,一般以常規的字元內容為主,有時候也會有圖片的顯示需要,那麼如果顯示圖片,我們應該如何實現呢?本篇隨筆介紹基於原生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控制項上綁定圖片的幾種操作方式,方便我們在項目中參考使用。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 面向對象的操作方式,spring統一定義在org.springframework.jdbc.object以RdbmsOperation作為頂層抽象定義 Spring對各種ORM的集成 Spring的集成主要體現在對ORM框架的封裝,jdbc提供了jdbctemplate Hibernate提供了hi ...
  • 首先下載wireshark並安裝 這是一個免費軟體。我也不懂 隨便就在百度里下載了個 ,版本是Version 2.4.3 。 然後是要在首選項里勾選dicom協議選項。 關於使用,這個我也是一臉懵逼,隨便給兩個網上的教程吧,http://openmaniak.com/cn/wireshark_fil ...
  • 最近在做項目過程中,經常會遇到生成訂單流水號唯一性的應用,也有不少同事也請教我對唯一性的 "流水號"的問題,根據個人所見,一般生成的規則都是根據日期來進行操作,我目前在做的一個項目:”報告卡“上的編碼就是根據 ”yyyyMMdd+四位數字(累加)“的格式生成,一般對這一類的操作最好是在存儲過程中生成 ...
  • 因公司ELK監控分析日誌的需要,需要區分進程運行狀態日誌以及錯誤日誌,以便能夠根據日誌級別(level)進行不同策略的預警,而現有的Nlog、Log4Net都沒有Process這樣的level,故針對這兩個日誌框架做了一些擴展,實現了自定義PROCESS LEVEL,因代碼不多,故直接貼代碼,有疑問 ...
  • 第一種 split()方法將一個字元串對象的每個字元拆出來,並且將每個字元串當成數組的每個元素reverse()方法用來改變數組,將數組中的元素倒個序排列,第一個數組元素成為最後一個,最後一個變成第一個join()方法將數組中的所有元素邊接成一個字元串 第二種 for迴圈給原字元串做一個遞減遍歷,然 ...
  • 這兩天試了下Stylet框架,這個框架雖然很小,但是功能齊全,簡化了很多MVVM的代碼,比如Command,對Dialog,MessageBox都有很好的支持。 開源地址 https://github.com/canton7/Stylet 新建一個WPF項目,添加NuGet引用 安裝完成後會自動添加 ...
  • 使用兩個c#的特性: 加在類上的:[DataContract] 加在欄位上的:[DataMember(Name = "ResultCode",EmitDefaultValue = true,IsRequired = true, Order = 1)] 這個order就是控制順序的。C#就是辣麽強大。 ...
  • 這篇文章只是簡單展示一個基於HTTP請求如何抓取數據的文章,如覺得簡單的朋友,後續我們再慢慢深入研究探討。 圖1: 如圖1,我們工作過程中,無論平臺網站還是企業官網,總少不了新聞展示。如某天產品經理跟我們說,推廣人員想要抓取百度新聞中熱點要聞版塊提高站點百度排名。要抓取百度的熱點要聞版本,首先我們先 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...