1

一部の列が編集可能なデータグリッドビューがあります。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 の単なるビューであるため、問題はそこにあります。どのデータソースを使用していますか? さらに、クラスを作成するとより美しくなります。各行はオブジェクトで表され、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 に答える