尝试更新列表时无法访问List字段,求技术解决方案
问题分析与解决
核心问题
你代码里的listevDetail是调用.ToList()后得到的List.EvidenceId这类字段会报错——List本身没有这些实体属性。
分场景修正方案
场景1:更新数据库查询到的现有记录
如果你的需求是把DataGrid里的行数据对应更新到查询出来的每条记录中,需要遍历集合里的单个实体:
var listevDetail = db.EvidenceDetail .Get(p => p.EvidenceId == _EvidenceId) .ToList(); // 取集合和DataGrid行的最小数量,避免索引越界 var loopCount = Math.Min(listevDetail.Count, dgEvidence.RowCount - 1); for (int i = 0; i < loopCount; i++) { // 取出集合里的单个实体对象 var evDetail = listevDetail[i]; // 以下EvidenceId查询时已满足,可省略 // evDetail.EvidenceId = _EvidenceId; evDetail.MerchandiseName = dgEvidence.Rows[i].Cells["Merchandise"].Value.ToString(); // 建议用TryParse避免非数字值导致崩溃 if(double.TryParse(dgEvidence.Rows[i].Cells["Weight"].Value.ToString(), out double weight)) { evDetail.weight = weight; } evDetail.Unit = dgEvidence.Rows[i].Cells["Unit"].Value.ToString(); evDetail.Description = dgEvidence.Rows[i].Cells["Description"].Value?.ToString(); db.EvidenceDetail.Update(evDetail); } // 统一保存,减少数据库交互次数 db.Save();
场景2:新增DataGrid行对应的记录
如果是要把DataGrid里的行数据作为新记录插入数据库,无需先查询集合,直接创建新实体:
for (int i = 0; i < dgEvidence.RowCount - 1; i++) { var newEvDetail = new EvidenceDetail(); newEvDetail.EvidenceId = _EvidenceId; newEvDetail.MerchandiseName = dgEvidence.Rows[i].Cells["Merchandise"].Value.ToString(); if(double.TryParse(dgEvidence.Rows[i].Cells["Weight"].Value.ToString(), out double weight)) { newEvDetail.weight = weight; } newEvDetail.Unit = dgEvidence.Rows[i].Cells["Unit"].Value.ToString(); newEvDetail.Description = dgEvidence.Rows[i].Cells["Description"].Value?.ToString(); db.EvidenceDetail.Add(newEvDetail); } db.Save();
额外注意事项
- 不要在循环里频繁调用
db.Save(),统一在循环结束后执行一次,提升性能 - 处理单元格值为空的情况,避免
NullReferenceException或格式转换异常
内容的提问来源于stack exchange,提问作者abbas
相关产品推荐
相关产品推荐

