编辑时无法捕获错误

本文关键字:错误 编辑 | 更新日期: 2023-09-27 17:53:30

我对c#和winforms有点陌生,需要一些帮助。

我已经创建了一个dataset并插入它2个表"order_lines"answers"products"。我有一个datagridview,列取自表"order_lines",这是一个空表(没有数据)。

因此,在datagridview中,我有3个空列:quantity, product (这是从其他数据集表products中获取的combobox)和我自己创建的列total (所有其他列如product_idorder_num都是不可见的)

我试图让用户在datagridview中编辑和插入数据到列数量(插入数字)到列产品(从组合框中选择产品),总数应该是quantity*product_price 的计算(根据从组合框中选择的产品,每个产品都有一个id,价格应该从表products根据产品id)

我有两个问题:

  1. 我试图检查用户插入的数据与cell_validating事件和data_error但它不起作用,而不是得到我的错误信息,当用户把无效的数据,我得到一个异常"object cannot be cast from dbnull to other types",我不明白为什么
  2. 我似乎无法从datasetproducts中获取价格,并根据所选产品在总列中使用它(在显示数据集表"order_lines"的datagridview中,数据集表"产品"中也有一个隐藏列"product_id",我有列"product_id"answers"product_name",这是datagridview中的组合框)当用户选择产品时,我需要获得价格。

我希望我能够解释我的问题,任何想法都将是非常感谢的

编辑时无法捕获错误

我建议你这样做:

DataTable products;
public Form1()
{
    InitializeComponent();
    // handle cell changes
    dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;
    // used for manually raising the ComboBox change
    dataGridView1.CurrentCellDirtyStateChanged += dataGridView1_CurrentCellDirtyStateChanged;
}
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // return if the row or column headers were changed
    if (e.RowIndex < 0 || e.ColumnIndex < 0)
        return;
    if (e.ColumnIndex != dataGridView1.Columns["total"].Index)
    {
        var value = 0;
        // get the product id from the ComboBox
        var product = dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["Product"].Index].Value;
        // get the quantity
        var quantity = dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["TotalQuantity"].Index].Value.ToString();
        if (product != null && !String.IsNullOrEmpty(quantity))
        {
            value =
                int.Parse(quantity) *
                int.Parse(products.Select("product_id = " + product.ToString())[0]["product_price"].ToString());
            dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["total"].Index].Value = value;
            dataGridView1.Invalidate();
        }
    }
}
void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}