C#中Guna2DataGridView库存与订购数量验证报错求助
Guna2DataGridView库存数量验证错误排查与解决
问题描述
在Guna2DataGridView中验证库存收货数量(UnitsInStock)与订购数量(UnitsOnOrder)的合理性时,运行代码出现错误,原代码如下:
private void Guna2DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { Guna2DataGridView view = sender as Guna2DataGridView; GridColumn colUnitsInStock = view.Columns["UnitsInStock"]; GridColumn colUnitsOnOrder = view.Columns["UnitsOnOrder"]; double unitsInStock = Convert.ToDouble(view.GetRowCellValue(view.FocusedRowHandle, colUnitsInStock)); double unitsOnOrder = Convert.ToDouble(view.GetRowCellValue(view.FocusedRowHandle, colUnitsOnOrder)); if (unitsInStock < unitsOnOrder) { view.SetColumnError(colUnitsInStock, "The Units On Order value should be less than this value."); view.SetColumnError(colUnitsOnOrder, "This value should be less than the Units In Stock value."); view.SetColumnError(null, "Invalid data"); e.Valid = false; e.ErrorText = "'Units On Order' and 'Units In Stock' values are not consistent."; } }
错误原因分析
- 类型不匹配:Guna2DataGridView的列类型是
DataGridViewColumn,代码中误用了DevExpress控件的GridColumn类型,导致获取列失败。 - 方法误用:
GetRowCellValue和FocusedRowHandle不是Guna2DataGridView的成员,Guna2DataGridView继承自标准DataGridView,需使用标准行/单元格访问方式。 - 未处理空值/非法输入:直接用
Convert.ToDouble转换单元格值,若单元格为空或非数字内容,会抛出转换异常。 - 错误提示方法错误:Guna2DataGridView没有
SetColumnError方法,需使用标准DataGridView的错误提示API。
修正后的代码
private void Guna2DataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { // 跳过标题行和无效行 if (e.RowIndex < 0 || e.ColumnIndex < 0) return; Guna2DataGridView dgv = sender as Guna2DataGridView; // 获取目标列 DataGridViewColumn colInStock = dgv.Columns["UnitsInStock"]; DataGridViewColumn colOnOrder = dgv.Columns["UnitsOnOrder"]; // 安全获取单元格值并转为字符串 string inStockStr = dgv.Rows[e.RowIndex].Cells[colInStock.Index].Value?.ToString().Trim(); string onOrderStr = dgv.Rows[e.RowIndex].Cells[colOnOrder.Index].Value?.ToString().Trim(); double unitsInStock, unitsOnOrder; // 验证输入是否为有效数字 if (!double.TryParse(inStockStr, out unitsInStock)) { e.Valid = false; e.ErrorText = "库存数量必须是有效数字"; dgv.Rows[e.RowIndex].ErrorText = "库存数量格式错误"; return; } if (!double.TryParse(onOrderStr, out unitsOnOrder)) { e.Valid = false; e.ErrorText = "订购数量必须是有效数字"; dgv.Rows[e.RowIndex].ErrorText = "订购数量格式错误"; return; } // 验证数量合理性 if (unitsInStock < unitsOnOrder) { e.Valid = false; e.ErrorText = "订购数量不能大于库存数量"; // 设置单元格级错误提示 dgv.Rows[e.RowIndex].Cells[colInStock.Index].ErrorText = "订购数量应小于此值"; dgv.Rows[e.RowIndex].Cells[colOnOrder.Index].ErrorText = "此值应小于库存数量"; // 设置行级错误提示 dgv.Rows[e.RowIndex].ErrorText = "数据不一致:订购数量超过库存"; } else { // 验证通过时清除所有错误提示 dgv.Rows[e.RowIndex].Cells[colInStock.Index].ErrorText = ""; dgv.Rows[e.RowIndex].Cells[colOnOrder.Index].ErrorText = ""; dgv.Rows[e.RowIndex].ErrorText = ""; } }
关键修正点说明
- 替换
GridColumn为DataGridViewColumn,匹配Guna2DataGridView的列类型。 - 使用
dgv.Rows[e.RowIndex].Cells[列索引].Value访问单元格值,遵循标准DataGridView的API规范。 - 用
double.TryParse替代Convert.ToDouble,避免空值/非数字导致的异常,同时完成格式验证。 - 使用
DataGridViewCell.ErrorText和DataGridViewRow.ErrorText设置错误提示,替代不存在的SetColumnError方法。 - 增加行索引有效性判断,避免处理标题行或无效行。
内容的提问来源于stack exchange,提问作者sahil samnani
相关产品推荐
相关产品推荐

