编辑时无法捕获错误
本文关键字:错误 编辑 | 更新日期: 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_id
和order_num
都是不可见的)。
我试图让用户在datagridview
中编辑和插入数据到列数量(插入数字)到列产品(从组合框中选择产品),总数应该是quantity*product_price
的计算(根据从组合框中选择的产品,每个产品都有一个id,价格应该从表products
根据产品id
)
我有两个问题:
- 我试图检查用户插入的数据与
cell_validating
事件和data_error
但它不起作用,而不是得到我的错误信息,当用户把无效的数据,我得到一个异常"object cannot be cast from dbnull to other types"
,我不明白为什么 - 我似乎无法从
dataset
表products
中获取价格,并根据所选产品在总列中使用它(在显示数据集表"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);
}