DataGridView帶圖標的單元格實現

来源:http://www.cnblogs.com/CUIT-DX037/archive/2017/08/13/7354057.html
-Advertisement-
Play Games

目的: 擴展 C# WinForm 自帶的表格控制項,使其可以自動判斷數據的上下界限值,並標識溢出。 這裡使用的方法是:擴展 表格的列 對象:DataGridViewColumn。 1.創建類:DecimalCheckCell 2.創建類:DecimalCheckColumn 3.現在就可以使用了,在 ...




目的:

擴展 C# WinForm 自帶的表格控制項,使其可以自動判斷數據的上下界限值,並標識溢出。

這裡使用的方法是:擴展 表格的列 對象:DataGridViewColumn。

1.創建類:DecimalCheckCell

    /// <summary>
    /// 可進行範圍檢查的 數值單元格
    /// </summary>
    public class DecimalCheckCell : DataGridViewTextBoxCell
    {
        private bool checkMaxValue = false;
        private bool checkMinValue = false;
        private decimal maxValue = 0;
        private decimal minValue = 0;

        public decimal MaxValue
        {
            get { return maxValue; }
            internal set { maxValue = value; }
        }

        public decimal MinValue
        {
            get { return minValue; }
            internal set { minValue = value; }
        }

        public bool CheckMaxValue
        {
            get { return checkMaxValue; }
            internal set { checkMaxValue = value; }
        }
        
        public bool CheckMinValue
        {
            get { return checkMinValue; }
            internal set
            {
                checkMinValue = value;
            }
        }


        public override object Clone()
        {
            DecimalCheckCell c = base.Clone() as DecimalCheckCell;
            c.checkMaxValue = this.checkMaxValue;
            c.checkMinValue = this.checkMinValue;
            c.maxValue = this.maxValue;
            c.minValue = this.minValue;
            return c;
        }

        protected override void Paint(Graphics graphics, Rectangle clipBounds,
            Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
            object value, object formattedValue, string errorText,
            DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle,
            DataGridViewPaintParts paintParts)
        {
            // Paint the base content
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
              value, formattedValue, errorText, cellStyle,
              advancedBorderStyle, paintParts);

            // 上下界限溢出判斷
            if (this.RowIndex < 0 || this.OwningRow.IsNewRow) // 行序號不為-1,且不是新記錄行(貌似沒用)
                return;
            if (value == null) return;

            decimal vCurValue = Convert.ToDecimal(value);
            bool overValue = false;
            Image img = null;
            if (checkMaxValue)
            {
                overValue = vCurValue > maxValue;
                img = VsTest.Properties.Resources.Undo; // 圖片來自 添加的資源文件
            }
            if (checkMinValue && !overValue)
            {
                overValue = vCurValue < minValue;
                img = VsTest.Properties.Resources.Redo; // 圖片來自 添加的資源文件
            }

            // 將圖片繪製在 數值文本後面
            if (overValue && img != null)
            {
                var vSize = graphics.MeasureString(vCurValue.ToString(), cellStyle.Font);

                System.Drawing.Drawing2D.GraphicsContainer container = graphics.BeginContainer();
                graphics.SetClip(cellBounds);
                graphics.DrawImageUnscaled(img, new Point(cellBounds.Location.X + (int)vSize.Width, cellBounds.Location.Y));
                graphics.EndContainer(container);
            }
        }

        protected override bool SetValue(int rowIndex, object value)
        {
            if (rowIndex >= 0)
            {
                try
                {
                    decimal vdeci = Convert.ToDecimal(value);  // 篩選非數字
                    base.ErrorText = string.Empty;
                }
                catch (Exception ex)
                {
                    base.ErrorText = "輸入錯誤" + ex.Message;
                    return false;
                }
            }
            return base.SetValue(rowIndex, value);
        }

        
    }

2.創建類:DecimalCheckColumn

    /// <summary>
    /// 可進行範圍檢查的 數值列
    /// </summary>
    public class DecimalCheckColumn : DataGridViewColumn
    {
        private bool checkMaxValue = false;
        private bool checkMinValue = false;
        private decimal maxValue = 0;
        private decimal minValue = 0;

        public decimal MaxValue
        {
            get { return maxValue; }
            set
            {
                maxValue = value;
                (base.CellTemplate as DecimalCheckCell).MaxValue = value;
            }
        }

        public decimal MinValue
        {
            get { return minValue; }
            set
            {
                minValue = value;
                (base.CellTemplate as DecimalCheckCell).MinValue = value;
            }
        }

        /// <summary>
        /// 是否對值上界限進行檢查,與MaxValue配合使用
        /// </summary>
        public bool CheckMaxValue
        {
            get { return checkMaxValue; }
            set
            {
                checkMaxValue = value;
                (base.CellTemplate as DecimalCheckCell).CheckMaxValue = value;
            }
        }
        /// <summary>
        /// 是否對值下界限進行檢查,與MinValue配合使用
        /// </summary>
        public bool CheckMinValue
        {
            get { return checkMinValue; }
            set
            {
                checkMinValue = value;
                (base.CellTemplate as DecimalCheckCell).CheckMinValue = value;
            }
        }

        public DecimalCheckColumn()
            : base(new DecimalCheckCell())
        {
            
        }

        public override object Clone()
        {
            DecimalCheckColumn c = base.Clone() as DecimalCheckColumn;
            c.checkMaxValue = this.checkMaxValue;
            c.checkMinValue = this.checkMinValue;
            c.maxValue = this.maxValue;
            c.minValue = this.minValue;

            return c;
        }

    }

3.現在就可以使用了,在窗體上拖一個 dataGridView 控制項,添加如下代碼:

        private void TestForm_Load(object sender, EventArgs e)
        {
            InitControlsProperties(); // 初始化

            // 綁定數據
            DataTable dTabel = new DataTable();
            dTabel.Columns.Add("ID",typeof(int));
            dTabel.Columns.Add("TestValue",typeof(decimal));
            Random rnd = new Random();
            for (int i = 0; i < 10; i++) // 隨機10個數
            {
                var vdr = dTabel.NewRow();
                vdr[0] = i + 1;
                vdr[1] = rnd.Next(50);
                dTabel.Rows.Add(vdr);
            }
            this.dataGridView1.DataSource = dTabel;
        }

        private void InitControlsProperties()
        {
            DecimalCheckColumn ColumnRoleID = new DecimalCheckColumn();
            ColumnRoleID.DataPropertyName = "ID";
            ColumnRoleID.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            ColumnRoleID.Name = "ID";
            ColumnRoleID.HeaderText = "序號";
            ColumnRoleID.Width = 50;
            this.dataGridView1.Columns.Add(ColumnRoleID);

            DecimalCheckColumn ColumnRoleName = new DecimalCheckColumn();
            ColumnRoleName.DataPropertyName = "TestValue";
            ColumnRoleName.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
            ColumnRoleName.Name = "TestValue";
            ColumnRoleName.HeaderText = "測試數據";
            ColumnRoleName.Width = 100;

            ColumnRoleName.CheckMaxValue = true; // 進行最大值檢查
            ColumnRoleName.MaxValue = 41;
            ColumnRoleName.CheckMinValue = true; // 進行最小值檢查
            ColumnRoleName.MinValue = 7;

            this.dataGridView1.Columns.Add(ColumnRoleName);

            //this.dataGridView1.AllowUserToAddRows = false;
            //this.dataGridView1.AllowUserToDeleteRows = false;
            //this.dataGridView1.ReadOnly = true;
            this.dataGridView1.AutoGenerateColumns = false;

        }

 運行效果如下圖所示

 
   

 那右邊圖是什麼鬼?

現在還有一個問題沒有解決:預設第一次載入出來的數據,並不能完全判斷出是否超界限,有時會有一兩個能判斷,有時完全不能判斷,但只需要用滑鼠去點擊各單元格,它又可以自動識別。暫時沒有發現問題原因所在。

 

 [http://www.cnblogs.com/CUIT-DX037/]

 


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

-Advertisement-
Play Games
更多相關文章
  • 又是一年年會時,正值各家公司紅人紛紛登場之際,Azure 自然也不會缺席。我們今年的主題是:Azure 杯年會 Cosplay,秀出你最愛的角色! ...
  • Azure 1 月新發佈:Microsoft Power BI Embedded 公共預覽和電腦視覺 API 標準版的更新以及 Azure IoT 網關 SDK 和中心設備管理新功能正式發佈以及關於計量名稱變更的通知 ...
  • 網關,物聯網網關 Azure 物聯網平臺可以按需運作,整合現有設備和服務,讓開發者利用自己熟悉的編程語言進行擴展,無縫整合企業部署的後端平臺。而隨著 Azure 物聯網網關 SDK(Software Development Kit)的進一步優化,用戶甚至可以將 Azure 數據中心外的物聯網和高級分... ...
  • CentOS 調教方法: ①刪除虛擬機但保留磁碟,隨後將系統盤作為數據盤掛載到臨時虛擬機上 ②修改配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 ③將虛擬網卡硬體地址改成正確的值,或刪除該行 ④保存並退出,分離該磁碟,並基於該磁碟新建虛擬機 SUSE... ...
  • Azure 12 月新發佈:導入/導出服務,虛擬機和雲服務的 Av2,虛擬網路對等互連現已正式發佈以及流分析的更新 ...
  • 共用訪問簽名是一種字元串,包含可附加到 URI 的安全令牌,可以讓我們委派對象的訪問許可權,並指定訪問的許可權和日期/時間範圍等限制。例如我們可以授予對 Blob、容器、隊列、文件和表的訪問許可權。很多服務在做驗證時都會用到 SAS,例如 Azure Service Bus、Azure IoT Hub 等... ...
  • 上篇講了 "《asp.net core在linux上的環境部署》" 。今天我們將做幾個小玩意實戰一下。用到的技術和工具有mysql、websocket、AngleSharp(爬蟲html解析)、nginx多站點部署。 NO1 留言板(mysql的使用) 演示:http://haojima.net 這 ...
  • 推薦網站:http://blog.csdn.net/zhuyu19911016520/article/category/6318590 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...