zoukankan      html  css  js  c++  java
  • DataGridView带图标的单元格实现



    目的:

    扩展 C# WinForm 自带的表格控件,使其可以自动判断数据的上下界限值,并标识溢出。

    这里使用的方法是:扩展 表格的列 对象:DataGridViewColumn。

    1.创建类:DataGridViewDecimalCheckCell.cs

        public class DataGridViewDecimalCheckCell : 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()
            {
                DataGridViewDecimalCheckCell c = base.Clone() as DataGridViewDecimalCheckCell;
                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 (rowIndex < 0 || this.OwningRow.IsNewRow) // 行序号不为-1,且不是新记录行
                    return;
                if (value == null) return;
                if (value.GetType() == typeof(DBNull)) 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.创建类:DataGridViewDecimalCheckColumn.cs

        public class  DataGridViewDecimalCheckColumn : 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 DataGridViewDecimalCheckCell).MaxValue = value;
                }
            }
    
            public decimal MinValue
            {
                get { return minValue; }
                set
                {
                    minValue = value;
                    (base.CellTemplate as DataGridViewDecimalCheckCell).MinValue = value;
                }
            }
    
            /// <summary>
            /// 是否对值上界限进行检查,与MaxValue配合使用
            /// </summary>
            public bool CheckMaxValue
            {
                get { return checkMaxValue; }
                set
                {
                    checkMaxValue = value;
                    (base.CellTemplate as DataGridViewDecimalCheckCell).CheckMaxValue = value;
                }
            }
            /// <summary>
            /// 是否对值下界限进行检查,与MinValue配合使用
            /// </summary>
            public bool CheckMinValue
            {
                get { return checkMinValue; }
                set
                {
                    checkMinValue = value;
                    (base.CellTemplate as DataGridViewDecimalCheckCell).CheckMinValue = value;
                }
            }
    
            public DataGridViewDecimalCheckColumn()
                : base(new DataGridViewDecimalCheckCell())
            {
                
            }
    
            public override object Clone()
            {
                DataGridViewDecimalCheckColumn c = base.Clone() as DataGridViewDecimalCheckColumn;
                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()
            {
                var vColumnID = new DataGridViewDecimalCheckColumn();
                vColumnID.DataPropertyName = "ID";
                vColumnID.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                vColumnID.Name = "ID";
                vColumnID.HeaderText = "序号";
                vColumnID.Width = 50;
                this.dataGridView1.Columns.Add(vColumnID);
    
                var vColumnValue = new DataGridViewDecimalCheckColumn();
                vColumnValue.DataPropertyName = "TestValue";
                vColumnValue.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
                vColumnValue.Name = "TestValue";
                vColumnValue.HeaderText = "测试数据";
                vColumnValue.Width = 100;
    
                vColumnValue.CheckMaxValue = true; // 进行最大值检查
                vColumnValue.MaxValue = 41;
                vColumnValue.CheckMinValue = true; // 进行最小值检查
                vColumnValue.MinValue = 7;
    
                this.dataGridView1.Columns.Add(vColumnValue);
    
                //this.dataGridView1.AllowUserToAddRows = false;
                //this.dataGridView1.AllowUserToDeleteRows = false;
                //this.dataGridView1.ReadOnly = true;
                this.dataGridView1.AutoGenerateColumns = false;
    
            }

    效果图:

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

  • 相关阅读:
    Hugo搭建的博客删除文章事宜
    [GIT] Git学习笔记
    VS Code: 解决安装code-runner扩展run后无法在只读编辑器下编辑
    c/c++结构体总结
    恢复U盘做启动盘后的容量
    Manjaro安装Mysql
    win10环境下安装manjaro kde(双系统)
    IDEA设置编辑区主题
    IDEA设置主体、窗体及菜单的字体大小
    IDEA设置项目文件编码
  • 原文地址:https://www.cnblogs.com/CUIT-DX037/p/7354057.html
Copyright © 2011-2022 走看看