全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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;

  }

运行效果如下图左所示

 那右边图是什么?

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

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


# DataGridView  # 图标  # 单元格  # DataGridView自定义单元格表示值、Error图标显示的方法介绍  # ASP.Net2.0 GridView 多列排序  # 显示排序图标  # 分页  # GridView实现桌面图标显示案例  # 可以自动  # 有一  # 还有一个  # 使其  # 暂时没有  # 不为  # 所示  # 并不能  # 自带  # 大家分享  # 有时会  # 绑定  # 具体内容  # 大家多多  # 如下图  # 就可以  # 但只  # 它又  # 最小值 


相关文章: 深入理解Android中的xmlns:tools属性  深圳网站制作的公司有哪些,dido官方网站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  制作营销网站公司,淘特是干什么用的?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何通过老薛主机一键快速建站?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  建站主机功能解析:服务器选择与快速搭建指南  阿里云网站制作公司,阿里云快速搭建网站好用吗?  南京网站制作费用,南京远驱官方网站?  如何快速使用云服务器搭建个人网站?  图册素材网站设计制作软件,图册的导出方式有几种?  建站之星如何实现网站加密操作?  如何彻底删除建站之星生成的Banner?  如何选择高性价比服务器搭建个人网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  北京建设网站制作公司,北京古代建筑博物馆预约官网?  高防服务器租用如何选择配置与防御等级?  c++ stringstream用法详解_c++字符串与数字转换利器  建站之星CMS建站配置指南:模板选择与SEO优化技巧  高性价比服务器租赁——企业级配置与24小时运维服务  网站企业制作流程,用什么语言做企业网站比较好?  中山网站推广排名,中山信息港登录入口?  如何在腾讯云服务器上快速搭建个人网站?  网站制作软件有哪些,制图软件有哪些?  北京网站制作公司哪家好一点,北京租房网站有哪些?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  高端网站建设与定制开发一站式解决方案 中企动力  如何在万网开始建站?分步指南解析  C++用Dijkstra(迪杰斯特拉)算法求最短路径  重庆网站制作公司哪家好,重庆中考招生办官方网站?  建站之星安装步骤有哪些常见问题?  高端建站三要素:定制模板、企业官网与响应式设计优化  为什么Go需要go mod文件_Go go mod文件作用说明  如何在Golang中指定模块版本_使用go.mod控制版本号  宝塔建站后网页无法访问如何解决?  网站制作服务平台,有什么网站可以发布本地服务信息?  建站主机与服务器功能差异如何区分?  兔展官网 在线制作,怎样制作微信请帖?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  代购小票制作网站有哪些,购物小票的简要说明?  清除minerd进程的简单方法  建站之星如何助力网站排名飙升?揭秘高效技巧  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。