DataGridView数据验证CellValidating()

http://www.cnblogs.com/greatverve/archive/2012/06/14/DataGridView-CellValidating.html

如果是TextBox可以通过KeyPress()事件,让用户无法输入非法数据。
DataGridView中的单元格,无法通过KeyPress()控制,可能我没找到方法。
通过CellValidating()在用户结束编辑时判断,如果不合法则还原数据。

复制代码
private  void dataGridView1_CellValidating( object sender, DataGridViewCellValidatingEventArgs e)
{
     // 可编辑的列
     if (e.ColumnIndex !=  2 && e.ColumnIndex !=  3)
         return;
     double outDb =  0;
     if ( double.TryParse(e.FormattedValue.ToString(),  out outDb))
    {
        e.Cancel =  false;
    }
     else
    {
        e.Cancel =  true; // 数据格式不正确则还原
        dataGridView1.CancelEdit();
    }
}
复制代码
TextBox的KeyPress()事件
复制代码
private  void txtK_KeyPress( object sender, KeyPressEventArgs e)
{
     double outDb =  0;
     if ( double.TryParse(txtK.Text + e.KeyChar.ToString(),  out outDb))
    {
        e.Handled =  false;
    }
     else
    {
        e.Handled =  true;
    }
}
复制代码
我继承TextBox重写KeyPress()封装了个自定义控件。
url: http://greatverve.cnblogs.com/archive/2012/06/14/DataGridView-CellValidating.html
定义单元格验证
要求:
验证错误后焦点不离开。
实现:
单元格的验证可以使用dgv_details_CellValidating事件。
验证不通过时调用e.Cancel = true;终止事件链,单元格将保持编辑状态。
调用dgv_details.CancelEdit();可以使单元格的内容会滚到修改前的值。
使用System.Windows.Forms.SendKeys.Send("^a");将全选单元格的内容。
 
单元格选中并开始编辑状态
实现:
//DataGridView获得焦点
dgv_details.Focus();
//DataGridView指定当前单元格
dgv_details.CurrentCell = dgv_details[0, 0];
//开始编辑状态
dgv_details.BeginEdit(false);
 
定制自动生成绑定了列
实现:
dgv_details.AutoGenerateColumns = false;
 
设置列的背景色
实现:
Color GridReadOnlyColor = Color.LightGoldenrodYellow;
dgv_details.Columns[1].DefaultCellStyle.BackColor =
WinKeys.GridReadOnlyColor;
 
DataGridView单元格验证的设计的问题
问题一:绑定还是不绑定?
绑定的优势:比较简单,代码少。
绑定得缺点:DataGridView中的数据受数据源的影响(主键约束、值类型约束)。不一至时会激发DataError事件,输入的内容无法保存到单元格中和数据源中。特殊的验证(比如长度、格式等)还是需要另外写代码实现。
关于增加行的问题。增加新行时多主键的验证有问题,而且验证不通过时会将新行全部删除。限制很多,很不方便。
 
非绑定的优势:验证等处理比较灵活。不受数据源的约束。
非绑定得缺点:显示和向数据库更新数据时需要比较多的代码实现,效率比较低。
 
总的感觉在处理验证比较麻烦的场合,我还是比较喜欢非绑定的方式。如果数据量大,验证比较简单的场合使用绑定模式比较好 

凡事以大气象去面对,优秀是一种习惯。

« 博主前一篇: c#枚举(Enum)的用法及遍历方法
» 博主后一篇: 上班族的坐姿
#1楼 [ 楼主] 2012-06-14 14:42 | 大气象  
?
1
2
3
4
if (e.KeyChar == ( char )Keys.Back)
    {
       return ;
    }

判断退格。

你可能感兴趣的:(datagridview)