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 contentbase.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/]

 

转载于:https://www.cnblogs.com/CUIT-DX037/p/7354057.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

包与模块管理及面向对象初步

模块 文章目录模块指令原因步骤搜索范围加目录面向对象编程封装实现初始化函数![在这里插入图片描述](https://img-blog.csdnimg.cn/20200201081513814.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80M…

spring生命周期七个过程_Spring杂文(三)Spring循环引用

众所周知spring在默认单例的情况下是支持循环引用的Appconfig.java类的代码Configurable ComponentScan("com.sadow") public class Appconfig { }X.java类的代码Component public class X {AutowiredY y;public X(){System.out.println("X create");} }Y.…

Linux 系统中的dvfs功能

前言最近硬件的同事需要我们提供的版本能动态调频&#xff0c;何为动态调频呢&#xff1f;对于CPU来讲&#xff0c;功耗和性能是一对不可调和的矛盾&#xff0c;通过调整CPU的电压和频率&#xff0c;可以在功耗和性能之间找一个平衡点。由于调整是在系统运行的过程中&#xff0…

python是面向对象还是过程_python编程:面向对象与过程是什么?

编程任何一个要素的学习都是基于更方便&#xff0c;更快捷&#xff0c;更效率而存在的&#xff0c;当然面向对象也一样&#xff0c;针对这部分知识&#xff0c;大家可以浏览以下内容&#xff0c;看完即懂。先来看一组示例&#xff1a;面向过程思维&#xff1a;把大象装进冰箱需…

Android系统下内存使用情况与监测

(0). Android/Linux 内存分配的两个重要策略.Linux 在分配内存时, 为了节省内存, 按需分配, 使用了延时分配以及Copy-On-Write 的策略.延时分配即针对user space 申请memory 时, 先只是明面上的分配虚拟空间, 等到真正操作memory 时, 才真正分配具体的物理内存, 这个需要借助…

node进阶| 解决表单enctype=multipart/form-data 时获取不到Input值的问题

今天在学习node踩到一个坑&#xff1a;form设置enctype"multipart/form-data"上传文件时&#xff0c;无法获取到表单其他input的值。 因为之前上传文件用的是 formidable 方法1&#xff1a;formidable &#xff08;无法获取其他input的值&#xff09; 引包 app.js v…

错误异常处理 小数格式化,取证与四舍五入 random处理 日期与时间常用操作

异常处理 文章目录异常处理语法错误语义错误逻辑错误异常处理finallytryecceptfinallyraise测试unittest测试组织代码常用断言方法是否正确存在约等于判断是否应用判断是否为空判断是否为某型实例判断大于类与测试装置setup函数teardown函数小数格式化&#xff0c;取证与四舍五…

什么是内存泄漏?

在wikipedia这样解读内存泄漏的&#xff1a;在计算机科学中&#xff0c;内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内存之前就…

python cx_oracle配置_python连接oracle的模块cx_Oracle安装和配置

下载相应版本的cx_Oracle安装cx_Oracle-5.1.2-11g-py24-1.x86_64.rpm&#xff0c;其他版本类似&#xff0c;rpm -ivh cx_Oracle-5.1.2-11g-py24-1.x86_64.rpm安装简单&#xff0c;但需要配置下面的环境变量和软连接在/etc/profile,添加export LD_LIBRARY_PATH/usr/lib/oracle/…

requests库之处理响应

response对象&#xff1a; http状态码 利用response把流存储成图片或者文件 一个下载图片的实例 import requestsdef download_pic():#headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36…

持久化概述

持久化概述 文章目录持久化概述对象持久化扁平文件pickleshelve数据库ORM扁平文件保留类型还原eval字符串转列表&#xff08;不带&#xff0c;&#xff09;![](https://img-blog.csdnimg.cn/20200201211443931.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,sha…

五分钟读懂TCP 协议

TCP 是互联网核心协议之一&#xff0c;本文介绍它的基础知识。一、TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层&#xff0c;有着自己的分工。&#xff08;图片说明&#xff1a;TCP 是以太网协议和 IP 协议的上层协议&#xff0c;也是应用层协议的下层协议。&…

git原理浅析及命令介绍

状态描写叙述 请记住&#xff0c;工作文件夹以下的全部文件都不外乎这两种状态&#xff1a;已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本号控制管理的文件&#xff0c;在上次快照中有它们的记录&#xff0c;工作一段时间后&#xff0c;它们的状态可能是未更新。已改动或者…

python怎么跳转到某一行代码_Python中免验证跳转到内容页的实例代码

在本篇文章里小编给大家整理的是一篇关于Python中免验证跳转到内容页的实例代码&#xff0c;有兴趣的朋友们可以学习分享下。相信很多人在浏览网页时&#xff0c;经常会碰到需要输入验证码才可以继续浏览的情况吧&#xff0c;遇到这种问题&#xff0c;大多数人只能进行繁琐的注…

正则表达

文章目录正则表达数据验证字面值\d查数字^\w特殊符号匹配规则.除|n所有字符\d查数字\D非数字![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213049246.png)\s空白字符![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213145246.png)\S非空白字符![在…

《从三月开始……》

很多时候&#xff0c;我们对不同现状有所不满——对无法冲破的工作瓶颈不满对久不增长的收入不满对久不下降的体重不满对无法提高的学分不满对没有进展的关系不满……似乎总有某个方面的不顺给我们带来烦恼为此&#xff0c;我们也做了“努力”——我们通过各种渠道和平台去查阅…

Thread.join()

1.join() join()的作用是&#xff1a;“等待该线程终止”&#xff0c;这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码&#xff0c;只有等到子线程结束了才能执行。 主线程生成并起动了子线程&#xff0c;而子线程里要进行大…

管理系统制作的python代码_python学生管理系统代码实现

本文实例为大家分享了python学生管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下类class Student:stuID ""name ""sex "M"classID "NULL"#set IDdef setStuID(self,stuID):self.stuID stuIDdef setName(self,…

从未知到2019年的文章汇总

2018年下半年我正式把这个遗弃了很久的微信号运营起来&#xff0c;2019年应该是比较正式的一年&#xff0c;也是成长最快的一年。从开始捣鼓微信公众号到现在&#xff0c;我写了很多东西。这篇文章把之前写过的&#xff0c;不管是好的&#xff0c;还是不好的&#xff0c;都整理…

python modbus控制plc_python Modbus基础

modbus 协议 数据格式00 00 00 00 00 06 01 03 00 00 00 02 ascii码第一位&#xff1a;事务处理标识符 由服务器复制&#xff0c;通常为0第二位&#xff1a;事务处理标识符 由服务器复制&#xff0c;通常为0第三位&#xff1a;协议标识符0第四位&#xff1a;协议标识符0第五…