软件编程
位置:首页>> 软件编程>> C#编程>> DataGridView带图标的单元格实现代码

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

作者:云梦鸿  发布时间:2021-08-07 16:50:04 

标签:DataGridView,图标,单元格

本文实例为大家分享了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带图标的单元格实现代码

 那右边图是什么?

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

来源:http://www.cnblogs.com/CUIT-DX037/archive/2017/08/13/7354057.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com