将未绑定的DataGridView转换为DataTable

时间:2016-04-13 06:11:20

标签: c# class datagridview datatable

我正在尝试将我的datagridview dgvInputForm1转换为另一个类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循环,我们应该做正确的工作。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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值。