DataGridView帶圖標的單元格實現(xiàn)代碼
目的:
擴展 C# WinForm 自帶的表格控件,使其可以自動判斷數(shù)據(jù)的上下界限值,并標識溢出。
這里使用的方法是:擴展 表格的列 對象:DataGridViewColumn。
1.創(chuàng)建類:DecimalCheckCell
/// <summary> /// 可進行范圍檢查的 數(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) // 行序號不為-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; // 圖片來自 添加的資源文件 } // 將圖片繪制在 數(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 = "輸入錯誤" + ex.Message; return false; } } return base.SetValue(rowIndex, value); } }
2.創(chuàng)建類:DecimalCheckColumn
/// <summary> /// 可進行范圍檢查的 數(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> /// 是否對值上界限進行檢查,與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.現(xiàn)在就可以使用了,在窗體上拖一個 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++) // 隨機10個數(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 = "序號"; 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 = "測試數(shù)據(jù)"; 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; }
運行效果如下圖左所示
那右邊圖是什么鬼?
現(xiàn)在還有一個問題沒有解決:默認第一次加載出來的數(shù)據(jù),并不能完全判斷出是否超界限,有時會有一兩個能判斷,有時完全不能判斷,但只需要用鼠標去點擊各單元格,它又可以自動識別。暫時沒有發(fā)現(xiàn)問題原因所在。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10C#中DataGridView常用操作實例小結
- 01-10C#實現(xiàn)3步手動建DataGridView的方法
- 01-10C#中DataGridView動態(tài)添加行及添加列的方法
- 01-10C#自定義DataGridViewColumn顯示TreeView
- 01-10C#重寫DataGridView
- 01-10Winform讓DataGridView左側顯示圖片
- 01-10Winform在DataGridView中顯示圖片
- 01-10C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法
- 01-10C#窗體布局方式詳解
- 01-10C#中序列化實現(xiàn)深拷貝,實現(xiàn)DataGridView初始化刷新的方法


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設置