DataGridView带图标的单元格实现_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > DataGridView带图标的单元格实现

DataGridView带图标的单元格实现

 2017/8/13 19:31:23  云梦鸿  程序员俱乐部  我要评论(0)
  • 摘要:目的:扩展C#WinForm自带的表格控件,使其可以自动判断数据的上下界限值,并标识溢出。这里使用的方法是:扩展表格的列对象:DataGridViewColumn。1.创建类:DecimalCheckCell///<summary>///可进行范围检查的数值单元格///</summary>publicclassDecimalCheckCell:DataGridViewTextBoxCell{privateboolcheckMaxValue=false
  • 标签:图标 实现 view tag


目的:

扩展 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/]

 

上一篇: ArrayList排序Sort()方法(转) 下一篇: 没有下一篇了!
发表评论
用户名: 匿名