You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.";
    }
}

错误原因分析

  1. 类型不匹配:Guna2DataGridView的列类型是DataGridViewColumn,代码中误用了DevExpress控件的GridColumn类型,导致获取列失败。
  2. 方法误用:GetRowCellValue和FocusedRowHandle不是Guna2DataGridView的成员,Guna2DataGridView继承自标准DataGridView,需使用标准行/单元格访问方式。
  3. 未处理空值/非法输入:直接用Convert.ToDouble转换单元格值,若单元格为空或非数字内容,会抛出转换异常。
  4. 错误提示方法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:09:31