DataGridView带图标的单元格实现代码
作者:云梦鸿 发布时间:2021-08-07 16:50:04
标签:DataGridView,图标,单元格
本文实例为大家分享了DataGridView带图标的单元格实现具体代码,供大家参考,具体内容如下
目的:
扩展 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/archive/2017/08/13/7354057.html
0
投稿
猜你喜欢
- 创建hander文件夹在 java 源码目录下创建hander文件夹, 在该文件夹下创建CustomAuthenticationFailHa
- 虹软免费,高级版本试用支持在线、离线有 Java SDK,C++ SDK一、注册虹软开发者平台点击注册注册完成后可在“我
- SpringBoot 中配置redis作为session 缓存器。 让shiro引用本文是建立在你是使用这shiro基础之上的补充内容第一种
- CyclicBarrier线程同步java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可
- 我就废话不多说了,大家还是直接看代码吧~Caused by: java.net.SocketException: Software caus
- 编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制。传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析
- 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道。当服务器提供下载服务时,使用下载者是共享带宽的
- 实例如下:/** * 弹出一个带确认和取消的dialog * @param context * @param title * @param
- 操作字符串的类都有哪些?区别是什么?操作字符串的类主要用三个,分别是String类,StringBuffer类和StringBuilder类
- DOM4可以读取和添加XML文件的属性或者元素读取属性:public static void ReadAttributes() throws
- /// 除去所有在HTML元素中标记 public static string&nbs
- java字符串如何进行比较?我们可以根据内容和引用来比较Java中的String。它用于身份验证(通过 equals() 方法)、排序(通过
- 最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.cl
- 本文实例讲述了Android编程解析XML方法。分享给大家供大家参考,具体如下:XML在各种开发中都广泛应用,Android也不例外。作为承
- 本文实例讲述了C#实现带阴历显示的日期代码,分享给大家供大家参考。具体方法如下:这是一个用于酒店预定功能的带日期控件,类似去哪网酒店预定,由
- 使用@Provider注意事项(要点)1.在Mapper接口和@InsertProvider方法类中,不要使用重载,也就是说,不要使用方法名
- 1.写个Mybatis-plus配置类:是通过 * 实现分页@Configurationpublic class MybatisConfig
- 1. 你可以讲下进程与线程的区别?为什么要用多线程?进程:进程是程序的一次执行过程,是系统运行程序的基本单位。线程:单个进程中执行中每个任务
- 简介Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shi
- 本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下项目用到的技术点和亮点语音录音 (单个和列表)语音播