我在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单元格并单击下一个单元格,出现一个这样的消息框
与Age列相同,消息“string无法识别为有效的Int32”
我怎样才能摆脱检查......
有没有办法压制这个?
编辑1
我在这里找到了类似的问题
但对我帮助不大。
编辑2
我把这个事件
private void GridViewPassenger_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
e.Cancel = true;
return;
}
现在消息框消失了...但是我无法提交空单元格。当我清除单元格然后我无法点击表单中的任何其他位置。唯一的机会是单击 Esc ,然后编辑ID消失...它将恢复为单元格中的值。
有没有办法将column的数据类型更改为datagridview的字符串?
解决
我自己找到了解决方案。我会把它作为答案发布。
答案 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();
这解决了我的问题。