我正在尝试将我的datagridview dgvInput
从Form1
转换为另一个类DataTable
中的Queries
以准备SqlBulkCopy
。我将dgvInput
传递给了我的班级SaveAll
中的方法Queries
,参数为DataGridView dgv
。
Form1中:
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
。但是,我仍然得到一个例外。根据我所研究的嵌套for循环,我们应该做正确的工作。
我该如何解决这个问题?
答案 0 :(得分:1)
问题是因为您的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
值。