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

Winform Grid数据保存失败及Infragistics类型转换错误求助

解决WinForm中UltraGrid选中行赋值decimal字段的类型错误问题

嘿,我来帮你搞定这个问题~ 你遇到的错误本质很清晰:你正试图把一个UltraGridRow对象直接赋值给decimal类型的字段,这俩类型完全不兼容,所以编译器直接报错了。

问题根源

cmbGodownFrom.SelectedRow返回的是选中的整行对象,而objInvDetail.mQty_Out、objInvDetail.mQty是存储数值的decimal类型字段,你需要从选中行里提取对应数量列的具体数值,而不是直接赋值整个行对象。

修复方案

下面是具体的代码调整方式,你可以根据自己的列名/索引来修改:

1. 基础版(已知列名)

先判断是否有选中行,再从指定列提取值并转换为decimal:

// 处理出库数量
if (cmbGodownFrom.SelectedRow != null)
{
    // 把"QtyOut"替换成你实际存储出库数量的列名
    objInvDetail.mQty_Out = Convert.ToDecimal(cmbGodownFrom.SelectedRow.Cells["QtyOut"].Value);
}

// 处理入库数量
if (cmbGoDownTo.SelectedRow != null)
{
    // 把"QtyIn"替换成你实际存储入库数量的列名
    objInvDetail.mQty = Convert.ToDecimal(cmbGoDownTo.SelectedRow.Cells["QtyIn"].Value);
}

2. 安全版(避免空值/格式错误)

如果单元格可能为空或非数字,建议用decimal.TryParse做安全转换,防止运行时异常:

// 处理出库数量
if (cmbGodownFrom.SelectedRow == null)
{
    MessageBox.Show("请选择出库仓库对应的行!");
    return;
}

decimal qtyOut;
var outQtyValue = cmbGodownFrom.SelectedRow.Cells["QtyOut"].Value;
if (outQtyValue == DBNull.Value || !decimal.TryParse(outQtyValue.ToString(), out qtyOut))
{
    MessageBox.Show("出库数量格式无效,请检查!");
    return;
}
objInvDetail.mQty_Out = qtyOut;

// 处理入库数量
if (cmbGoDownTo.SelectedRow == null)
{
    MessageBox.Show("请选择入库仓库对应的行!");
    return;
}

decimal qtyIn;
var inQtyValue = cmbGoDownTo.SelectedRow.Cells["QtyIn"].Value;
if (inQtyValue == DBNull.Value || !decimal.TryParse(inQtyValue.ToString(), out qtyIn))
{
    MessageBox.Show("入库数量格式无效,请检查!");
    return;
}
objInvDetail.mQty = qtyIn;

3. 整合到你的mSave方法

把上面的逻辑嵌入到你的保存方法里,大概是这样:

public override void mSave()
{
    try
    {
        if (mValidate())
        {
            // --- 新增的数量赋值逻辑 ---
            // 处理出库数量
            if (cmbGodownFrom.SelectedRow == null)
            {
                MessageBox.Show("请选择出库仓库对应的行!");
                return;
            }

            decimal qtyOut;
            var outQtyValue = cmbGodownFrom.SelectedRow.Cells["你的出库数量列名"].Value;
            if (outQtyValue == DBNull.Value || !decimal.TryParse(outQtyValue.ToString(), out qtyOut))
            {
                MessageBox.Show("出库数量格式无效,请检查!");
                return;
            }
            objInvDetail.mQty_Out = qtyOut;

            // 处理入库数量
            if (cmbGoDownTo.SelectedRow == null)
            {
                MessageBox.Show("请选择入库仓库对应的行!");
                return;
            }

            decimal qtyIn;
            var inQtyValue = cmbGoDownTo.SelectedRow.Cells["你的入库数量列名"].Value;
            if (inQtyValue == DBNull.Value || !decimal.TryParse(inQtyValue.ToString(), out qtyIn))
            {
                MessageBox.Show("入库数量格式无效,请检查!");
                return;
            }
            objInvDetail.mQty = qtyIn;
            // --- 数量赋值逻辑结束 ---

            // 这里写你原本的数据库保存逻辑
            // 比如:dbContext.InvDetails.Add(objInvDetail);
            // dbContext.SaveChanges();

            MessageBox.Show("数据保存成功!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"保存失败:{ex.Message}");
    }
}

内容的提问来源于stack exchange,提问作者Zee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:53