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
相关产品推荐
相关产品推荐

