C# 如何验证DataGridView输入?
我在DataGridView输入验证方面遇到了一些严重问题: 我正在使用Entity Framework进行一个项目,并将DataGridView元素绑定到数据库 如果用户将一些数据插入到不可为空的列中,然后清除数据使该列留空,然后单击另一个DataGridView单元格,则会发生异常,我会得到一个运行时错误 或者,如果用户试图在整数列中插入字符串,他们会收到一条很长的错误消息,这对用户来说一点也不友好C# 如何验证DataGridView输入?,c#,sql-server,entity-framework,data-binding,datagridview,C#,Sql Server,Entity Framework,Data Binding,Datagridview,我在DataGridView输入验证方面遇到了一些严重问题: 我正在使用Entity Framework进行一个项目,并将DataGridView元素绑定到数据库 如果用户将一些数据插入到不可为空的列中,然后清除数据使该列留空,然后单击另一个DataGridView单元格,则会发生异常,我会得到一个运行时错误 或者,如果用户试图在整数列中插入字符串,他们会收到一条很长的错误消息,这对用户来说一点也不友好 验证DataGridView单元格有什么简单的方法吗?我相信您正在查找DataGridVie
验证DataGridView单元格有什么简单的方法吗?我相信您正在查找
DataGridView.DataError
事件。如果希望对数据进行自定义验证,则应处理此事件。大概是这样的:
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = entities;
dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
}
void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// you can obtain current editing value like this:
string value = null;
var ctl = dataGridView1.EditingControl as DataGridViewTextBoxEditingControl;
if (ctl != null)
value = ctl.Text;
// you can obtain the current commited value
object current = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
string message;
switch (e.ColumnIndex)
{
case 0:
// bound to integer field
message = "the value should be a number";
break;
case 1:
// bound to date time field
message = "the value should be in date time format yyyy/MM/dd hh:mm:ss";
break;
// other columns
default:
message = "Invalid data";
break;
}
MessageBox.Show(message);
}
您可以检查输入数据的值,并显示该值的相应错误消息。例如,如果值为null或空且字段不可为null,则可以显示一条消息,指示该值不能为空
希望这有帮助。输入以下代码以处理事件:
谢谢,当您将
DataGridView
绑定到Entity FrameWork
@masoudkeshavarz时,它不起作用。我已经用Entity FrameWork 4.0进行了测试,它适合我。我认为你的情况不同,你能准确地解释一下你在做什么吗,比如你如何为gridview提供数据源,你在运行时更改了哪种列类型而没有输入DataError
事件。谢谢你的回复。我以前尝试过用DataError
处理这个异常。但是当您使用实体框架时
数据错误
事件永远不会发生。当您将字段保留为空值时,会从其他地方发生异常,并显示以下消息:“此属性不能设置为空值”。我提供了数据源
,包括以下步骤。我制作了一个edmx
文件。我把桌子拖进去了。我在数据源
选项卡中单击了添加新数据源
,并从对象
中选择了d数据提供。然后我将我的DataGridView
绑定到它。为什么不将EF类映射到DTO或ViewModels中呢?然后绑定到简单对象,根据需要尽快或最晚进行验证,并在映射它们时获取数据库/域/任何特定错误。作为奖励,将视图与数据存储分离,让您可以在必要时自由地进行重构。
switch (e.ColumnIndex)
{
case 0:
// bound to integer field
message = "the value should be a number";
break;
case 1:
// bound to date time field
message = "the value should be in date time format yyyy/MM/dd hh:mm:ss";
break;
// other columns
default:
message = "Invalid data";
break;
}
MessageBox.Show(message);