抑制DatagridView中的DataError事件

时间:2015-03-27 05:10:31

标签: c# winforms datagridview

我在C#窗体中获得了一个DataGridView,它填充了excel文件中的数据。

我将excel绑定到网格

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"";
            OleDbConnection oledbconnection = new OleDbConnection(connectionString);

                oledbconnection.Open();
                OleDbCommand oledbcommand = new OleDbCommand("SELECT * FROM [StudentInformationSheet$]", oledbconnection);
                oledbadapter = new OleDbDataAdapter(oledbcommand);
                ds = new DataSet();
                oledbadapter.Fill(ds, "Passengers");
                DataTable dt = ds.Tables[0];
        GridViewPassenger.DataSource = ds.Tables[0].DefaultView;
                    oledbconnection.Close();

要求

填充网格后我可以编辑网格..我想要一些字段不是强制性的。让我们说3个字段,DOB,年龄,地址不是强制性的。所以我可以清除单元格中的数据。


问题

当我清除地址字段时,它工作正常。现在我清除DOB单元格并单击下一个单元格,出现一个这样的消息框 enter image description here

与Age列相同,消息“string无法识别为有效的Int32”


我怎样才能摆脱检查......

有没有办法压制这个?

编辑1

我在这里找到了类似的问题

DataError Dialog Box

但对我帮助不大。

编辑2

我把这个事件

private void GridViewPassenger_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            e.Cancel = true;
            return;
        }

现在消息框消失了...但是我无法提交空单元格。当我清除单元格然后我无法点击表单中的任何其他位置。唯一的机会是单击 Esc ,然后编辑ID消失...它将恢复为单元格中的值。

有没有办法将column的数据类型更改为datagridview的字符串?


解决

我自己找到了解决方案。我会把它作为答案发布。

2 个答案:

答案 0 :(得分:0)

您可以在cell_leave事件中处理错误,而不是抑制错误:

Private Sub DGV_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.RowEnter
        Dim theDate As DateTime
        If Date.TryParse(DGV(0, e.RowIndex).Value.ToString, theDate) Then
            DTP.CustomFormat = "dd MMMM yyyy"
            DTP.Value = theDate
        Else
            DTP.CustomFormat = " "
        End If
    End Sub

上述代码在以下链接的答案中进一步说明: https://social.msdn.microsoft.com/Forums/en-US/4cdf1a3e-ed84-41ae-9e22-a8108a371dff/null-value-from-datagridview-to-datetimepicker?forum=Vsexpressvb

答案 1 :(得分:0)

我找到了解决方案。在将dt绑定到网格之前,我更改了dt列的数据类型。

这是我的附加代码。

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"";
            OleDbConnection oledbconnection = new OleDbConnection(connectionString);

                oledbconnection.Open();
                OleDbCommand oledbcommand = new OleDbCommand("SELECT * FROM [StudentInformationSheet$]", oledbconnection);
                oledbadapter = new OleDbDataAdapter(oledbcommand);
                ds = new DataSet();
                oledbadapter.Fill(ds, "Passengers");
                DataTable dt = ds.Tables[0];

                DataTable dtCloned = dt.Clone();

                dtCloned.Columns[0].DataType = typeof(string);
                dtCloned.Columns[1].DataType = typeof(string);

                foreach (DataRow row in dt.Rows)
                {
                    dtCloned.ImportRow(row);
                }
                GridViewPassenger.DataSource = dtCloned.DefaultView;
                oledbconnection.Close();

这解决了我的问题。