正在将未绑定的DataGridView转换为DataTable



我正在尝试将我的数据网格视图dgvInputForm1转换为另一个类Queries中的DataTable,为SqlBulkCopy做准备。我用参数DataGridView dgvdgvInput传递给类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].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值。

最新更新