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

 更新时间:2020年6月25日 11:18  点击:2145

目的:

扩展 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;

  }

运行效果如下图左所示

 那右边图是什么鬼?

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

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

[!--infotagslink--]

相关文章

  • Illustrator绘制一个方形的录音机图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制一个方形的录音机图标的教程,各位想知道具体绘制方法的使用者们,那么下面就来看一下小编给大家分...2016-09-14
  • C#实现3步手动建DataGridView的方法

    这篇文章主要介绍了C#实现3步手动建DataGridView的方法,实例分析了C#实现手动创建DataGridView的原理与技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中DataGridView动态添加行及添加列的方法

    这篇文章主要介绍了C#中DataGridView动态添加行及添加列的方法,涉及C#中DataGridView针对行与列动态操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#中datagridview使用tooltip控件显示单元格内容的方法

    这篇文章主要介绍了C#中datagridview使用tooltip控件显示单元格内容的方法,实例分析了C#控件的相关使用技巧,需要的朋友可以参考下...2020-06-25
  • vue+elementui实现点击table中的单元格触发事件--弹框

    这篇文章主要介绍了vue+elementui实现点击table中的单元格触发事件--弹框,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-18
  • 你最喜欢哪个版本?MIUI八个历史版本的系统图标汇总

    小米在3月9日下午5点推送了小米5的MIUI8.2更新,这次升级最大的改变是核心变成了Android7.0,因此加入了不少新功能。从MIUI1到MIUI8,历经了好几年了,下面小编为大家整理MIUI八个历史版本的系统图标,来看看吧...2017-07-06
  • C# listview添加combobox到单元格的实现代码

    从别处转来的,自己进行了一些小的修改,还不错,你自己先拖一个ListView1和一个ComboBox1,需要的朋友可以参考下...2020-06-25
  • JS组件系列之Bootstrap Icon图标选择组件

    这篇文章给大家介绍js组件系列之Bootstrap Icon图标选择组件,对bootstrap icon图标相关知识感兴趣的朋友一起学习吧...2016-02-01
  • css中Font字体小图标应用

    Font字体小图标应用其实是在以前我们常用的css sprite进行升级了,我们可以直接在css中调用字体了,下面我们来看一篇关于Font字体小图标应用例子。 我们知道在页面上...2016-09-14
  • Delphi使用大图标编译程序的方法

    这篇文章主要介绍了Delphi使用大图标编译程序的方法,需要的朋友可以参考下...2020-06-30
  • C#中DataGridView常用操作实例小结

    这篇文章主要介绍了C#中DataGridView常用操作,以实例形式总结了DataGridView绑定下拉列表、设置默认值、判断复选框是否选中等技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#利用Excel直接读取数据到DataGridView

    这个例子的功能是c#读取excel文件,大家可以参考使用...2020-06-25
  • 实现DataGridView控件中CheckBox列的使用实例

    最近做WindowsForms程序,使用DataGridView控件时,加了一列做选择用,发现CheckBox不能选中。搜索后,要实现DataGridView的CellContentClick事件,将代码贴一下...2021-09-22
  • c#中datagridview处理非绑定列的方法

    这篇文章主要介绍了c#中datagridview处理非绑定列的方法,实例分析了C#中datagridview的使用技巧,需要的朋友可以参考下...2020-06-25
  • C#中改变DataGridView控件边框颜色的方法

    这篇文章主要介绍了C#中改变DataGridView控件边框颜色的方法,默认的DataGridView边框颜色很丑,本文用编程方法实现修改DataGridView边框颜色,需要的朋友可以参考下...2020-06-25
  • C#中DataGridView的样式

    这篇文章主要介绍了C#中DataGridView的样式设置方法,包括交替行颜色、单元格内容有效性检查、单元格的选择模式等,需要的朋友可以参考下...2020-06-25
  • Illustrator快速制作出斜面浮雕效果的小图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说快速制作出斜面浮雕效果的小图标的教程,各位想知道具体绘制方法的使用者,那么下面就快来跟着小编一起...2016-09-14
  • C# 实现dataGridView选中一行右键出现菜单的示例代码

    这篇文章主要介绍了C# 实现dataGridView选中一行右键出现菜单,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-03
  • C#实现带消息数的App图标

    这篇文章主要介绍了如何使用C#实现带消息数的App图标的方法,并附上全部源码,分享给大家,有需要的小伙伴可以参考下。...2020-06-25
  • Illustrator绘制SVG圣诞图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制SVG圣诞图标的教程,各位想知道具体绘制方法的使用者,那么下面就快来跟着小编看看教程吧。 给...2016-09-14