DataGridView帶圖標(biāo)的單元格實(shí)現(xiàn)代碼
目的:
擴(kuò)展 C# WinForm 自帶的表格控件,使其可以自動(dòng)判斷數(shù)據(jù)的上下界限值,并標(biāo)識(shí)溢出。
這里使用的方法是:擴(kuò)展 表格的列 對(duì)象:DataGridViewColumn。
1.創(chuàng)建類:DecimalCheckCell
/// <summary>
/// 可進(jìn)行范圍檢查的 數(shù)值單元格
/// </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) // 行序號(hào)不為-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; // 圖片來(lái)自 添加的資源文件
}
if (checkMinValue && !overValue)
{
overValue = vCurValue < minValue;
img = VsTest.Properties.Resources.Redo; // 圖片來(lái)自 添加的資源文件
}
// 將圖片繪制在 數(shù)值文本后面
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); // 篩選非數(shù)字
base.ErrorText = string.Empty;
}
catch (Exception ex)
{
base.ErrorText = "輸入錯(cuò)誤" + ex.Message;
return false;
}
}
return base.SetValue(rowIndex, value);
}
}
2.創(chuàng)建類:DecimalCheckColumn
/// <summary>
/// 可進(jìn)行范圍檢查的 數(shù)值列
/// </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>
/// 是否對(duì)值上界限進(jìn)行檢查,與MaxValue配合使用
/// </summary>
public bool CheckMaxValue
{
get { return checkMaxValue; }
set
{
checkMaxValue = value;
(base.CellTemplate as DecimalCheckCell).CheckMaxValue = value;
}
}
/// <summary>
/// 是否對(duì)值下界限進(jìn)行檢查,與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.現(xiàn)在就可以使用了,在窗體上拖一個(gè) dataGridView 控件,添加如下代碼:
private void TestForm_Load(object sender, EventArgs e)
{
InitControlsProperties(); // 初始化
// 綁定數(shù)據(jù)
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++) // 隨機(jī)10個(gè)數(shù)
{
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 = "序號(hào)";
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 = "測(cè)試數(shù)據(jù)";
ColumnRoleName.Width = 100;
ColumnRoleName.CheckMaxValue = true; // 進(jìn)行最大值檢查
ColumnRoleName.MaxValue = 41;
ColumnRoleName.CheckMinValue = true; // 進(jìn)行最小值檢查
ColumnRoleName.MinValue = 7;
this.dataGridView1.Columns.Add(ColumnRoleName);
//this.dataGridView1.AllowUserToAddRows = false;
//this.dataGridView1.AllowUserToDeleteRows = false;
//this.dataGridView1.ReadOnly = true;
this.dataGridView1.AutoGenerateColumns = false;
}
運(yùn)行效果如下圖左所示
那右邊圖是什么鬼?
現(xiàn)在還有一個(gè)問題沒有解決:默認(rèn)第一次加載出來(lái)的數(shù)據(jù),并不能完全判斷出是否超界限,有時(shí)會(huì)有一兩個(gè)能判斷,有時(shí)完全不能判斷,但只需要用鼠標(biāo)去點(diǎn)擊各單元格,它又可以自動(dòng)識(shí)別。暫時(shí)沒有發(fā)現(xiàn)問題原因所在。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:C#教程
下一篇:C# 計(jì)算傳入的時(shí)間距離今天的時(shí)間差
本文標(biāo)題:DataGridView帶圖標(biāo)的單元格實(shí)現(xiàn)代碼
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5537.html
您可能感興趣的文章
- 01-10C#中DataGridView常用操作實(shí)例小結(jié)
- 01-10C#實(shí)現(xiàn)3步手動(dòng)建DataGridView的方法
- 01-10C#中DataGridView動(dòng)態(tài)添加行及添加列的方法
- 01-10C#自定義DataGridViewColumn顯示TreeView
- 01-10C#重寫DataGridView
- 01-10Winform讓DataGridView左側(cè)顯示圖片
- 01-10Winform在DataGridView中顯示圖片
- 01-10C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法
- 01-10C#窗體布局方式詳解
- 01-10C#中序列化實(shí)現(xiàn)深拷貝,實(shí)現(xiàn)DataGridView初始化刷新的方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置


