服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - DataGridView带图标的单元格实现代码

DataGridView带图标的单元格实现代码

2022-01-19 11:26云梦鸿 C#

这篇文章主要为大家详细介绍了DataGridView带图标的单元格的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

目的:

DataGridView带图标的单元格实现代码

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

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

1.创建类:decimalcheckcell

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/// <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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/// <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 控件,添加如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
 
 }

运行效果如下图左所示

DataGridView带图标的单元格实现代码

DataGridView带图标的单元格实现代码

 那右边图是什么鬼?

现在还有一个问题没有解决:默认第一次加载出来的数据,并不能完全判断出是否超界限,有时会有一两个能判断,有时完全不能判断,但只需要用鼠标去点击各单元格,它又可以自动识别。暂时没有发现问题原因所在。

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/CUIT-DX037/archive/2017/08/13/7354057.html

延伸 · 阅读

精彩推荐
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05