2016-04-13 54 views
1

我试图将我的datagridview dgvInputForm1转换为另一个类Queries中的DataTable以准备SqlBulkCopy。我将dgvInput传递给我的中的方法SaveAll,其参数为DataGridView dgv将未绑定的DataGridView转换为DataTable

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循环中,应该做好工作。

我该如何解决这个问题?

+1

“dr.Cells [i]'或'dr.Cells [i] .Value'为'null'。可能是'dr.Cells [i]'。使用空条件运算符。 – Ian

+0

谢谢! 'dr.Cells [i] .Value'是'null'。具体来说,它生成的第一行是空的。我可以以某种方式删除该空行? – Hexxed

+0

@ Ian NVM。我刚刚发现为什么它是空的。我最后一行是空白的。只需设置'AllowUserToAddRows = false'。感谢您的帮助。请在下面发布您的答案。所以我可以接受它。 – Hexxed

回答

1

问题是因为您的dr.Cells[i].Valuenull,这是由于选项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