1

我有一个datagridview,其中一些列是可编辑的。Datagrid 自动在底部添加新行。我想在单击按钮时将网格的内容插入数据库中。但是当我为每个循环编写插入查询时,由于底部未提交的行 异常:对象引用未设置为对象实例 请帮助我修复这个..代码在这里

private void btn_save_Click(object sender, EventArgs e)
{
    try
    {
        con.Open();
        cmd = new SqlCommand("Select SupplierId from  tbl_Supplier where SupplierName ='" + cmbSupplierName.Text + "'", con);
        sdr = cmd.ExecuteReader();
        if (sdr.HasRows)
        {
            while (sdr.Read())
            {
                string sup_id = sdr["SupplierId"].ToString();
                //txt_id.Text = sup_id;
            }
        }

        foreach (DataGridViewRow row in grdPurchase.Rows)
        {
            string material_id = row.Cells[2].Value.ToString();
            int m_id = int.Parse(material_id);
            string Quantity = row.Cells[3].Value.ToString();
            float m_quantity = float.Parse(Quantity);
            string rate = row.Cells[4].Value.ToString();
            float m_rate = float.Parse(rate);
            string total = row.Cells[5].Value.ToString();
            float m_total = float.Parse(total);
            //string bill = txt_billno.Text;
            int supplier_id = int.Parse(sup_id);
            //string date = dtp_Purchase.Text;

            // dt.Rows.Add(supplier_id, bill, m_id, m_quantity, m_rate, m_total, date);
            String query = "insert into tbl_Purchase (SupplierId,MaterialId,BillNo,Quantity,Rate,Total,Date) values(" + supplier_id + "," + m_id + ",'" + txt_billno.Text + "'," + m_quantity + "," + m_rate + "," + m_total + ",'" +  dtp_Purchase.Text + "')";
            cmd = new SqlCommand(query, con);
            cmd.ExecuteNonQuery();
                //object id = cmd.ExecuteScalar();
                //  string purchase_id = id.ToString();
            MessageBox.Show("Inserted: ");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }
    finally
    {
        sdr.Close();
        con.Close();
    }
}
4

2 回答 2

0

不正常,GridView 自动添加一行。您确定此行在您的数据源中不可用吗?GridView 只是您的 DataSource 的一个视图,所以问题就在那里。您正在使用哪个数据源?此外,如果您创建一个类,它会更漂亮。每行由一个对象表示,您的数据源是一个列表。如果您想从 GridView 获取所有数据,您可以使用 List 或从您的类中强制转换类型中的每个 DataRow。

问候

于 2012-06-18T12:19:45.317 回答
0

您可以使用IsNewRow属性过滤掉新行:

foreach (DataGridViewRow row in grdPurchase.Rows)
{
   if (row.IsNewRow)
   {
       continue;
   }
   ...
于 2012-06-07T12:45:39.983 回答