0

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

我创建了一个dataset并将其插入 2 个表“ order_lines ”和“ products ”。我有一个datagridview从表“ order_lines ”中提取的列,这是一个空表(没有数据)。

因此,在datagridview我有 3 个空列:quantityproduct combobox取自其他数据集表productstotal我自己创建的列(所有其他列,例如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. 我似乎没有设法从dataset表中获取价格products并根据所选产品在总列中使用它(在显示数据集表“ order_lines ”的datagridview中,数据集表中还有一个隐藏列“product_id” “产品”当用户选择我需要获取价格的产品时,我有列“product_id”和“product_name”,这是 datagridview 中的组合框。

我希望我设法解释了我的问题,任何想法将不胜感激

4

1 回答 1

0

我建议你这样做:

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);
}
于 2013-01-16T14:39:59.013 回答