使用JcsNumberTextBox控件构建只允许输入数字并可以控制精度的数据列JcsNumTextBoxColumn

一.引子

当我们在做WinForm的数据库开发时,时常会用到datagridview控件来显示数据.在提供数据交互的时候,常常希望可以对用户输入的数据进行校验.对于一些类似金额的字段,要求只允许输入数字,并且要控制精度.这个时候,我们通常会想到2种解决方法.其一,就是先任随用户输入,然后在Invalidating或lostfocus等事件中做验证并提示.其二,就是我这里所演示的方法,就是直接控制用户的输入,这样将省略去很多冗繁的操作,给数据库程序的快速开发带来方便.

二.设计时效果

三.运行时效果

四.源代码

1)DataGridViewTextBoxCell

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Windows.Forms;
using  System.ComponentModel;

namespace  JcsExpLibary.Numeric_Textbox
{
    
public class JcsNumTextBoxCell : DataGridViewTextBoxCell
    
{
        
private bool _isreadonly = true//是否允许回车代替TAB
        private bool _isintegral = false;//是否整数输入
        private bool _EnPaste = true;//是否允许粘贴
        private bool _EnContextMenu = true//是否允许现实右键菜单
        private int _PointNumber = -1;//为-1时允许输入任意位小数
        private bool _isnegativenumber = false//是否允许输入负数


        
public JcsNumTextBoxCell(): base()
        
{
           
        }

        
/// <summary>
        
/// 是否只读
        
/// </summary>

        [Category("JCS属性"), Description("是否只读。")]
        
public bool Isreadonly
        
{
            
get return this._isreadonly; }
            
set this._isreadonly = value; }
        }

        
/// <summary>
        
/// 是否是整数 
        
/// </summary>

        [Category("JCS属性"), Description("是否整数。")]
        
public bool isintegral
        
{
            
get return this._isintegral; }
            
set { _isintegral = value; }
        }


        
/// <summary>
        
/// 是否允许输入负数 
        
/// </summary>

        [Category("JCS属性"), Description("是否允许输入负数。")]
        
public bool IsNegativeNumber
        
{
            
get return _isnegativenumber; }
            
set { _isnegativenumber = value; }
        }

        
/// <summary>
        
/// 精度位数控制(即:允许输入几位小数控制) 
        
/// </summary>

        [Category("JCS属性"), Description("精度位数控制,-1时允许输入任意位小数。")]
        
public int PointNumber
        
{
            
get return _PointNumber; }
            
set this._PointNumber = value; }
        }

        [Category(
"JCS属性"), Description("是否允许粘贴。")]
        
public bool EnablePaste
        
{
            
get return _EnPaste; }
            
set
            
{
                _EnPaste 
= value;
            }

        }

        
/// <summary>
        
/// 
        
/// </summary>

        [Category("JCS属性"), Description("是否右键菜单。")]
        
public bool EnableContextMenu
        
{

            
get return _EnContextMenu; }
            
set
            
{
                _EnContextMenu 
= value;
            }

        }

        
//初始化用于编辑单元格的控件
        public override void InitializeEditingControl(int rowIndex,
                                                      
object initialFormattedValue,
                                                      DataGridViewCellStyle dataGridViewCellStyle)
        
{
            JcsNumTextBoxEditingControl numbertextbox;
            JcsNumTextBoxColumn jcsnumcol;
            DataGridViewColumn dgvc;

            
base.InitializeEditingControl(rowIndex, initialFormattedValue,
                                          dataGridViewCellStyle);
            
//获取承载控件
            numbertextbox = DataGridView.EditingControl as JcsNumTextBoxEditingControl;

            
            
//获取包含此单元格的列
            dgvc = this.OwningColumn;   // this.DataGridView.Columns[this.ColumnIndex];
            if (dgvc is JcsNumTextBoxColumn)
            
{
                jcsnumcol 
= dgvc as JcsNumTextBoxColumn;
                numbertextbox.Isreadonly 
= jcsnumcol.Isreadonly;
                numbertextbox.isintegral 
= jcsnumcol.isintegral;
                numbertextbox.IsNegativeNumber 
= jcsnumcol.IsNegativeNumber;
                numbertextbox.PointNumber 
= jcsnumcol.PointNumber;
                numbertextbox.EnablePaste 
= jcsnumcol.EnablePaste;
                numbertextbox.EnableContextMenu 
= jcsnumcol.EnableContextMenu;
                numbertextbox.Text 
= (string)this.Value;
            }

        }


        
//获取单元格的寄宿编辑控件的类型
        public override Type EditType
        
{
            
get
            
{
                
return typeof(JcsNumTextBoxEditingControl);
            }

        }

    }

}

 

2)DataGridViewColumn

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.ComponentModel;
using  System.Windows.Forms;
using  System.Drawing;

namespace  JcsExpLibary.Numeric_Textbox
{
    
public class JcsNumTextBoxColumn : DataGridViewColumn
    
{
        
private bool _isreadonly = true//是否允许回车代替TAB
        private bool _isintegral = false;//是否整数输入
        private bool _EnPaste = true;//是否允许粘贴
        private bool _EnContextMenu = true//是否允许现实右键菜单
        private int _PointNumber = -1;//为-1时允许输入任意位小数
        private bool _isnegativenumber = false//是否允许输入负数


        
public JcsNumTextBoxColumn()
            : 
base(new JcsNumTextBoxCell())
        
{
        }


        
/// <summary>
        
/// 是否只读
        
/// </summary>

        [Category("JCS属性"), Description("是否只读。")]
        
public bool Isreadonly
        
{
            
get return this._isreadonly; }
            
set this._isreadonly = value; }
        }

        
/// <summary>
        
/// 是否是整数 
        
/// </summary>

        [Category("JCS属性"), Description("是否整数。")]
        
public bool isintegral
        
{
            
get return this._isintegral; }
            
set 
            

                
if (this._isintegral != value)
                
{
                    
this._isintegral = value;
                    JcsNumTextBoxCell jcsnumcel;
                    DataGridViewCell dgvc;
                    
int rowCount;
                    
//
                    
// first, update the value on the template cell.
                    
//
                    jcsnumcel = (JcsNumTextBoxCell)this.CellTemplate;
                    jcsnumcel.isintegral 
= value;

                    
//
                    
// now set it on all cells in other rows as well.
                    
//
                    if (this.DataGridView != null && this.DataGridView.Rows != null)
                    
{
                        rowCount 
= this.DataGridView.Rows.Count;
                        
for (int i = 0; i < rowCount; i++)
                        
{
                            dgvc 
= this.DataGridView.Rows.SharedRow(i).Cells[i];
                            
if (dgvc is JcsNumTextBoxCell)
                            
{
                                jcsnumcel 
= (JcsNumTextBoxCell)dgvc;
                                jcsnumcel.isintegral 
= value;
                            }

                        }

                    }

                }

            }

        }


        
/// <summary>
        
/// 是否允许输入负数 
        
/// </summary>

        [Category("JCS属性"), Description("是否允许输入负数。")]
        
public bool IsNegativeNumber
        
{
            
get return _isnegativenumber; }
            
set { _isnegativenumber = value; }
        }

        
/// <summary>
        
/// 精度位数控制(即:允许输入几位小数控制) 
        
/// </summary>

        [Category("JCS属性"), Description("精度位数控制,-1时允许输入任意位小数。")]
        
public int PointNumber
        
{
            
get return _PointNumber; }
            
set this._PointNumber = value; }
        }

        [Category(
"JCS属性"), Description("是否允许粘贴。")]
        
public bool EnablePaste
        
{
            
get return _EnPaste; }
            
set
            
{
                _EnPaste 
= value;
            }

        }

        
/// <summary>
        
/// 
        
/// </summary>

        [Category("JCS属性"), Description("是否右键菜单。")]
        
public bool EnableContextMenu
        
{

            
get return _EnContextMenu; }
            
set
            
{
                _EnContextMenu 
= value;
            }

        }



        
//获取或设置用于创建新单元格的模板
        public override DataGridViewCell CellTemplate
        
{
            
get
            
{
                
return base.CellTemplate;
            }


            
set
            
{
                
// 
                if (value != null && !value.GetType().IsAssignableFrom(typeof(JcsNumTextBoxCell)))
                
{
                    
string s = "Cell type is not based upon the JcsNumTextBoxCell.";
                    
throw new InvalidCastException(s);
                }


                
base.CellTemplate = value;
            }

        }


    }

}

 

3)JcsNumTextBoxEditingControl

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Windows.Forms;

namespace  JcsExpLibary.Numeric_Textbox
{
    
public class JcsNumTextBoxEditingControl:JcsInputNum ,IDataGridViewEditingControl 
    
{
        
protected int rowIndex;
        
protected DataGridView dataGridView;
        
protected bool valueChanged = false;

        
public JcsNumTextBoxEditingControl()
        
{

        }

        
//重写jcsinputnum的ontextchanged
        protected override void OnTextChanged(EventArgs e)
        
{
            
base.OnTextChanged(e);
            
//通知datagridview值已经更改
            NotifyDataGridViewOfValueChange();
        }


        
//通知DataGridView值已经更改
        protected virtual void NotifyDataGridViewOfValueChange()
        
{
            
this.valueChanged = true;
            
if (this.dataGridView != null)
            
{
                
//设置当前单元格有未提交的更改
                this.dataGridView.NotifyCurrentCellDirty(true);
            }

        }


        
IDataGridViewEditingControl Members // IDataGridViewEditingControl.
        
        
///   Routine to translate between DataGridView
        
///   content alignments and text box horizontal alignments.

        private static HorizontalAlignment translateAlignment(DataGridViewContentAlignment align)
        
{
            
switch (align)
            
{
                
case DataGridViewContentAlignment.TopLeft:
                
case DataGridViewContentAlignment.MiddleLeft:
                
case DataGridViewContentAlignment.BottomLeft:
                    
return HorizontalAlignment.Left;

                
case DataGridViewContentAlignment.TopCenter:
                
case DataGridViewContentAlignment.MiddleCenter:
                
case DataGridViewContentAlignment.BottomCenter:
                    
return HorizontalAlignment.Center;

                
case DataGridViewContentAlignment.TopRight:
                
case DataGridViewContentAlignment.MiddleRight:
                
case DataGridViewContentAlignment.BottomRight:
                    
return HorizontalAlignment.Right;
            }


            
throw new ArgumentException("Error: Invalid Content Alignment!");
        }

    }

}

 

4)测试代码

 

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;
using  JcsExpLibary.Numeric_Textbox;
namespace  WindowsApplication1
{
    
public partial class Form9 : Form
    
{
        
public Form9()
        
{
            InitializeComponent();
            InitializeDataGridViewColumns();
        }

        
private void InitializeDataGridViewColumns()
        
{
            DataGridViewTextBoxColumn dgvtbc;
            JcsNumTextBoxColumn  jcsnumtextcol;

            
//
            
// employee name.
            
//
            dgvtbc = new DataGridViewTextBoxColumn();
            dgvtbc.HeaderText 
= "Name";
            dgvtbc.Width 
= 120;
            
this.dataGridView1.Columns.Add(dgvtbc);

            
//
            
// Employee Value
            
//
            jcsnumtextcol = new JcsNumTextBoxColumn();
            jcsnumtextcol.HeaderText 
= "Employee Value";
            jcsnumtextcol.isintegral 
= false;
            jcsnumtextcol.IsNegativeNumber 
= true;
            jcsnumtextcol.PointNumber 
= 2;
            jcsnumtextcol.EnableContextMenu 
= false;
            jcsnumtextcol.EnablePaste 
= false;
            jcsnumtextcol.Width 
= 75;
            
this.dataGridView1.Columns.Add(jcsnumtextcol);


            
//
            
// Address
            
//
            dgvtbc = new DataGridViewTextBoxColumn();
            dgvtbc.HeaderText 
= "Address";
            dgvtbc.Width 
= 150;
            
this.dataGridView1.Columns.Add(dgvtbc);

            
//
            
// City
            
//
            dgvtbc = new DataGridViewTextBoxColumn();
            dgvtbc.HeaderText 
= "City";
            dgvtbc.Width 
= 75;
            
this.dataGridView1.Columns.Add(dgvtbc);

            
//
            
// Department Code
            
//
            dgvtbc = new DataGridViewTextBoxColumn();
            dgvtbc.HeaderText 
= "Department";
            dgvtbc.ValueType 
= typeof(int);
            dgvtbc.Width 
= 75;
            
this.dataGridView1.Columns.Add(dgvtbc);
        }

    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值