我正在尝试将我的数据网格视图dgvInput
从Form1
转换为另一个类Queries
中的DataTable
,为SqlBulkCopy
做准备。我用参数DataGridView dgv
将dgvInput
传递给类Queries
中的方法SaveAll
。
表格1:
public void convert2DT(DataGridView dgv)
{
Queries qry = new Queries();
qry.SaveAll(dgvInput);
}
类别:
class Queries {
public void SaveAll(DataGridView dgv)
{
foreach (DataGridViewRow dr in dgv.Rows)
{
//Create table and insert into cell value.
DataRow dataRow = dt.NewRow();
for (int i = 0; i < noOfColumns; i++)
{
if (i == 0)
>> { dataRow[i] = DateTime.Parse(dr.Cells[i].Value.ToString()); }
else if (i == 7)
{ dataRow[i] = int.Parse(dr.Cells[i].Value.ToString()); }
else
{ dataRow[i] = dr.Cells[i].Value.ToString(); }
}
dt.Rows.Add(dataRow);
}
//SqlBulkCopy Codes
}
}
我在>>
行得到NullReferenceException
错误消息:对象引用未设置为对象的实例。我已尝试将New
设置为dgv
。然而,我仍然得到一个例外。根据我的研究,嵌套循环应该做正确的工作。
我该如何解决此问题?
问题是因为您的dr.Cells[i].Value
是null
,而这是由选项AllowUserToAddRows = true
导致的最后一行为空引起的,如稍后所述。要解决此问题,可以将AllowUserToAddRows = false
作为您所做的操作。
但在处理dr.Cells[i].Value
之前,最好检查它是否不是null
,以使其对任何可能找到的null
小区值都更加稳健:
for (int i = 0; i < noOfColumns; i++)
{
if (dr.Cells[i].Value == null)
continue; //don't process
if (i == 0)
{ dataRow[i] = DateTime.Parse(dr.Cells[i].Value.ToString()); }
else if (i == 7)
{ dataRow[i] = int.Parse(dr.Cells[i].Value.ToString()); }
else
{ dataRow[i] = dr.Cells[i].Value.ToString(); }
}
并且使用continue
来忽略null
小区。只有当你真的认真的时候才使用AllowUserToAddRows = false
;也就是说,防止用户添加行,而不是防止单元格的null
值。