DataGridView带图标的单元格实现代码
作者:云梦鸿 时间:2021-08-07 16:50:04
本文实例为大家分享了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
标签:DataGridView,图标,单元格
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
c#与WMI使用技巧集第1/2页
2022-03-16 05:16:01
WMI获取硬件信息封装函数方法(联想台式机出厂编号 CPUID BIOS序列号 硬盘信息 显卡信息 MAC地址)
2023-10-03 13:39:54
Android RecyclerView添加FootView和HeadView
2022-12-11 21:17:11
![](https://img.aspxhome.com/file/2023/5/109195_0s.gif)
java基础的详细了解第五天
2023-06-02 16:54:04
![](https://img.aspxhome.com/file/2023/9/65349_0s.png)
Unity3D启动外部程序并传递参数的实现
2021-12-10 07:10:59
![](https://img.aspxhome.com/file/2023/3/96353_0s.jpg)
c# 复写Equals方法的实现
2023-06-09 01:35:35
Java try-with-resource语法使用解析
2021-10-09 02:28:37
MyBatis的SQL执行结果和客户端执行结果不一致问题排查
2022-12-30 20:37:22
![](https://img.aspxhome.com/file/2023/6/73096_0s.jpg)
SpringBoot 内置工具类的使用
2021-08-26 11:42:21
java递归算法实例分析
2022-02-09 07:59:17
![](https://img.aspxhome.com/file/2023/0/68170_0s.png)
Java使用openOffice对于word的转换及遇到的问题解决
2021-12-03 00:01:16
Java流程控制顺序结构原理解析
2022-09-13 14:14:03
![](https://img.aspxhome.com/file/2023/1/79311_0s.png)
idea中的Maven导包失败问题解决方案汇总
2023-07-12 12:34:22
![](https://img.aspxhome.com/file/2023/7/70567_0s.png)
RegexOptions.IgnoreCase正则表达式替换,忽略大小写
2022-05-03 17:25:45
C#使用RichTextBox实现替换文字及改变字体颜色功能示例
2023-07-04 23:04:18
c#利用Excel直接读取数据到DataGridView
2023-02-22 13:39:07
SpringBoot集成支付宝沙箱支付(支付、退款)
2022-02-15 16:50:52
Android动态布局小结
2021-10-17 12:04:39
Java实现俄罗斯方块的源码分享
2023-02-17 04:20:48
![](https://img.aspxhome.com/file/2023/2/69902_0s.png)
浅谈JVM中的JOL
2022-10-06 15:44:49