System.InvalidCastException异常:Linq Table转List失败求助
异常问题:System.InvalidCastException类型转换失败
抛出异常
System.InvalidCastException: 无法将类型为'System.Data.Linq.Table
1[SalesWithLinq.DAL.UnitName]'的对象转换为类型'System.Collections.Generic.List1[SalesWithLinq.DAL.UnitName]'。
问题场景
在RepositoryItemLookUpEdit中添加单位名称,离开单元格时保存至数据库,数据已成功存入,但执行类型转换代码时抛出上述异常。
相关代码
窗体类字段
RepositoryItemLookUpEdit repoUOM = new RepositoryItemLookUpEdit(); // 窗体类的字段
窗体加载事件代码
repoUOM.DisplayMember = "Name"; // 窗体加载事件内 repoUOM.ValueMember = "ID"; // 窗体加载事件内 repoUOM.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard; // 窗体加载事件内
ProcessNewValue事件处理代码
private void RepoUOM_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e) { if (e.DisplayValue is string value && value.Trim() != string.Empty) { var NewObject = new UnitName() { Name = value.Trim() }; using (var db = new dbDataContext()) { db.UnitNames.InsertOnSubmit(NewObject); db.SubmitChanges(); } ((List<UnitName>)repoUOM.DataSource).Add(NewObject); // 此处抛出异常 e.Handled = true; } }
解决方案
问题根源是repoUOM.DataSource实际为System.Data.Linq.Table<UnitName>类型,并非List<UnitName>,直接强制转换会触发异常,可通过以下两种方式解决:
- 初始化时将数据源转为List
在窗体加载阶段,不要直接绑定db.UnitNames,而是转为List类型后再赋值:
using (var db = new dbDataContext()) { repoUOM.DataSource = db.UnitNames.ToList(); }
后续就能直接将repoUOM.DataSource强转为List<UnitName>添加新对象。
- 添加新对象后重新绑定数据源
若不想修改初始化逻辑,可在保存新对象后,重新从数据库获取数据并绑定,同时设置选中项:
// 替换原强制转换代码 using (var db = new dbDataContext()) { repoUOM.DataSource = db.UnitNames.ToList(); } // 选中刚添加的单位 repoUOM.EditValue = NewObject.ID;
第一种方式更高效,避免重复查询数据库;第二种方式适合需要确保数据源与数据库完全同步的场景。
内容的提问来源于stack exchange,提问作者Mohamed Gaber
相关产品推荐
相关产品推荐

