目的:

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

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

1.创建类:DataGridViewDecimalCheckCell.cs

    public class DataGridViewDecimalCheckCell : DataGridViewTextBoxCell
{
private bool checkMaxValue = false;
private bool checkMinValue = false;
private decimal maxValue = ;
private decimal minValue = ; 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 < || 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 >= )
{
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 = ;
private decimal minValue = ; 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 = ; i < ; i++) // 随机10个数
{
var vdr = dTabel.NewRow();
vdr[] = i + ;
vdr[] = rnd.Next();
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 = ;
this.dataGridView1.Columns.Add(vColumnID); var vColumnValue = new DataGridViewDecimalCheckColumn();
vColumnValue.DataPropertyName = "TestValue";
vColumnValue.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
vColumnValue.Name = "TestValue";
vColumnValue.HeaderText = "测试数据";
vColumnValue.Width = ; vColumnValue.CheckMaxValue = true; // 进行最大值检查
vColumnValue.MaxValue = ;
vColumnValue.CheckMinValue = true; // 进行最小值检查
vColumnValue.MinValue = ; 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/]

DataGridView带图标的单元格实现的更多相关文章

  1. C# DataGridView中指定的单元格不能编辑

    注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. ReadOnly属性的使用 DataGridView内所有的单元格不能编辑 当DataGridView.Re ...

  2. c#DataGridView数据绑定示例——格式化单元格的内容(转)

    转自http://blog.csdn.net/testcs_dn/article/details/37834063 c#DataGridView数据绑定示例 格式化单元格的内容 在使用DataGrid ...

  3. Easyui的datagrid的行编辑器Editor中添加事件(修改某个单元格带出其他单元格的值)

    项目中有个datagrid需要编辑行时,用到Editor的属性,那么如何添加一个事件 问题:同一个编辑行中的某个单元格值改变时,修改其他单元格的值 页面用到的datagrid <table id ...

  4. datagridview 纵向 横向 合并单元格

    datagridview 单元格合并:纵向以及横向合并参考了csdn上不知哪位的代码,具体哪位找不到连接了. 纵向合并: /// <summary> /// 纵向合并,即合并数据项的值 / ...

  5. DataGridView根据条件给单元格绑定图片

    代码区: private void Form1_Load(object sender, EventArgs e) { myClass.mySqliteAPI conn = new myClass.my ...

  6. DataGridView单元格内容自动匹配下拉显示

    页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信 ...

  7. DataGridView单元格显示GIF图片

    本文转载:http://home.cnblogs.com/group/topic/40730.html DataGridView单元格显示GIF图片 gifanimationindatagrid.ra ...

  8. DataGridView 的单元格的边框、 网格线样式的设定【转】

    1) DataGridView 的边框线样式的设定DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的. BorderStyle 属性设定值是 ...

  9. c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)

    一.单元格内容的操作 *****// 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index ...

随机推荐

  1. poj1195(二维树状数组)

    题目链接:https://vjudge.net/problem/POJ-1195 题意:有s*s的矩阵,初始化为全0,有两种操作,单点修改(x,y)的值,区间查询(x,y)的值(l<=x< ...

  2. 通知类型 重点: 环绕通知 (XML配置)

    前置通知:在切入点方法执行之前执行 <aop:before method="" pointcut-ref="" ></aop:before&g ...

  3. CF70D(动态凸包)

    CF70D(动态凸包) 给出q(<=1e5)个询问,每次在加上一个点,维护凸包,或者询问某个点是否在凸包内(在边上也算). 听说可以用cdq做--但是并不会.我等蒟蒻只会用平衡树做. 首先,假设 ...

  4. 8. sql 片段

    sql 片段: <sql id="columnBase"> `id`, `title`, `author_id` as authorId, `state`, `feat ...

  5. pytorch批训练数据构造

    这是对莫凡python的学习笔记. 1.创建数据 import torch import torch.utils.data as Data BATCH_SIZE = 8 x = torch.linsp ...

  6. java 中 静态泛型方法书写

    public class SpringBean { /** * */ public static <T> T getBean(Class<T> clazz,String nam ...

  7. P4173 残缺的字符串(FFT)

    [Luogu4173] 题解 \(1.\)定义匹配函数 \(2.\)定义完全匹配函数 \(3.\)快速计算每一位的完全匹配函数值 #include<cstdio> #include< ...

  8. P2575 高手过招

    传送门 直接搞好像搞不了 考虑转换模型 显然每一行棋子不会跑到其他行.. 所以可以把每一行的情况看成一个子博弈 显然整个答案就是每一行的SG值的异或和 不懂的回去学SG函数... 考虑怎么分析一行的状 ...

  9. POJ1185炮兵阵地(状态压缩DP)

    POJ飞翔.数据弱 ZQOJ飞翔 数据强 Description 司令部的将军们打算在N×M的网格地图上部署他们的炮兵部队.一个N×M的地图由N行M列组成,地图的每一格可能是山地(用"H&q ...

  10. Educational Codeforces Round 13 B

    Description The girl Taylor has a beautiful calendar for the year y. In the calendar all days are gi ...