C# 如何验证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输入验证方面遇到了一些严重问题:

我正在使用Entity Framework进行一个项目,并将DataGridView元素绑定到数据库

如果用户将一些数据插入到不可为空的列中,然后清除数据使该列留空,然后单击另一个DataGridView单元格,则会发生异常,我会得到一个运行时错误

或者,如果用户试图在整数列中插入字符串,他们会收到一条很长的错误消息,这对用户来说一点也不友好


验证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);