【问题标题】:Insert to database from datagridview data which is retrieved from another table in C# MSSQL从 C# MSSQL 中的另一个表中检索的 datagridview 数据插入到数据库
【发布时间】:2018-04-16 07:38:48
【问题描述】:

我有两个表“项目”和“发票”。我的表单中有一个带有标题的“datagridview” 现在,当用户输入“item desc”单元格值时,应用程序将从“item”表中填充“itemcode|item desc|item rate”(“根据用户输入,使用 item desc 单元格的自动完成属性和按键事件填充”) .现在用户将输入“数量”和“项目总计”(暂时手动)。然后按提交按钮。问题来了。它向我显示错误输入字符串不正确。但是当我手动输入所有单元格(我的意思是不使用 keydown 事件来填充数据)时,数据正在插入到发票表中。

这是我在发票表中插入的提交按钮

private void btn_submit_Click(object sender, EventArgs e)
        {
            try
            {
                foreach (DataGridViewRow row in dtgrdvw_items.Rows)
                {
                    using (SqlCommand cmd = new SqlCommand("insert into invoice values (@inv_no,@inv_date,@inv_cust_name,@inv_remarks,@inv_type,@inv_item_code,@inv_item_desc,@inv_item_rate," +
                        "@inv_item_qty,@inv_item_total)", con))
                    {
                        cmd.Parameters.AddWithValue("@inv_no", Convert.ToInt32(txt_inv_no.Text));
                        cmd.Parameters.AddWithValue("@inv_date", txt_date.Text);
                        cmd.Parameters.AddWithValue("@inv_cust_name", txt_cust_name.Text);
                        cmd.Parameters.AddWithValue("@inv_remarks", txt_remarks.Text);
                        cmd.Parameters.AddWithValue("@inv_type", cmbx_inv_type.SelectedItem);
                        cmd.Parameters.AddWithValue("@inv_item_code",Convert.ToInt32(row.Cells[0].Value));
                        cmd.Parameters.AddWithValue("@inv_item_desc",Convert.ToString(row.Cells[1].Value));
                        cmd.Parameters.AddWithValue("@inv_item_rate",Convert.ToDecimal(row.Cells[2].Value));
                        cmd.Parameters.AddWithValue("@inv_item_qty",Convert.ToInt32(row.Cells[3].Value));
                        decimal total = Convert.ToDecimal(row.Cells[2].Value) * Convert.ToDecimal(row.Cells[3].Value);
                        cmd.Parameters.AddWithValue("@inv_item_total",total);
                        if (con.State == ConnectionState.Closed)
                        {
                            con.Open();
                        }
                        cmd.ExecuteNonQuery();
                        con.Close();

                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            MessageBox.Show("invoice submitted");
        }

>

这是我的按键事件

 private void dtgrdvw_items_KeyDown(object sender, KeyEventArgs e)
          {
            if (e.KeyCode == Keys.Tab)
            {

                int rowindex = dtgrdvw_items.CurrentCell.RowIndex;
                int columnindex = dtgrdvw_items.CurrentCell.ColumnIndex;
                if (columnindex == 1)
                {
                    SqlCommand cmd = new SqlCommand("Select * from item WHERE item_desc=@inv_item_desc", con);
                    cmd.Parameters.Add("@inv_item_desc", SqlDbType.VarChar).Value = dtgrdvw_items.Rows[rowindex].Cells[columnindex].Value.ToString();
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    }
                    SqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {
                      dtgrdvw_items.Rows[rowindex].Cells[0].Value = dr[0].ToString();
                       dtgrdvw_items.Rows[rowindex].Cells[1].Value = dr[1].ToString();
                       dtgrdvw_items.Rows[rowindex].Cells[3].Value = dr[2].ToString();
                    }
                      dr.Close();
                }
           }
       } 

>

This is my gridview

请帮忙。

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    网格中的单元格 0码 1 描述 2 数量 3费率 共 4 个

    cmd.Parameters.AddWithValue("@inv_item_code",Convert.ToInt32(row.Cells[0].Value));
    cmd.Parameters.AddWithValue("@inv_item_desc",Convert.ToString(row.Cells[1].Value));
    cmd.Parameters.AddWithValue("@inv_item_rate",Convert.ToDecimal(row.Cells[2].Value)); //Change
    

    应该是:

    cmd.Parameters.AddWithValue("@inv_item_rate",Convert.ToDecimal(row.Cells[3].Value));
    
    cmd.Parameters.AddWithValue("@inv_item_qty",Convert.ToInt32(row.Cells[3].Value)); //Change
    

    应该是:

    cmd.Parameters.AddWithValue("@inv_item_qty",Convert.ToInt32(row.Cells[2].Value)); //Change
    

    【讨论】:

    • 该死的..你有夏洛克的眼睛..它现在工作了..非常感谢@Mary
    • 乐于助人。
    【解决方案2】:

    如果我理解正确,Rate 列接受整数类型。你可能想在

    上使用Convert.ToInt32
    dtgrdvw_items.Rows[rowindex].Cells[3].Value = dr[2].ToString();
    

    以便在将字符串分配给 Cells[3] (即 Rate 列)之前将其转换为整数。

    dtgrdvw_items.Rows[rowindex].Cells[3].Value = Convert.ToInt32(dr[2].ToString());
    

    【讨论】:

    • 不,它不会起作用..我自己试过了。在 datagridview 单元格中的值必须以文本/字符串格式传递。然后只有它显示。否则会弹出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2016-09-25
    • 2020-12-14
    相关资源
    最近更新 更多