WPF DataGrid绑定实体List转DataTable时DataView强制转换报错如何解决
问题核心原因
你在给DataGrid1.ItemsSource赋值时,传入的是EF实体集合ash.ToList()返回的List<Ashkhas>类型对象,而你搜索到的强制转DataView的方案仅适用于ItemsSource原本就绑定DataView、DataTable或DataSet衍生视图的场景,两种类型完全不兼容,直接强转自然会抛出类型转换异常。
可行解决方案
你可以选择以下两种方案之一适配你的业务需求:
方案1:直接将当前绑定的List实体集合转换为DataTable
你可以编写一个通用的List转DataTable方法,直接从ItemsSource的实际类型转换,不需要调整原有DataGrid加载逻辑:
使用该方法需要提前引用System.Reflection命名空间
// 通用List转DataTable方法 public static DataTable ListToDataTable<T>(List<T> dataList) { DataTable dt = new DataTable(typeof(T).Name); // 获取实体的所有公共属性 PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props) { // 给DataTable添加列,可空类型要取底层类型 Type columnType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; dt.Columns.Add(prop.Name, columnType); } // 填充行数据 foreach (T item in dataList) { object[] values = new object[props.Length]; for (int i = 0; i < props.Length; i++) { values[i] = props[i].GetValue(item) ?? DBNull.Value; } dt.Rows.Add(values); } return dt; }
调用时直接转成你实际绑定的List类型即可:
DataTable dt = ListToDataTable<Ashkhas>((List<Ashkhas>)DataGrid1.ItemsSource);
方案2:调整DataGrid加载逻辑,直接绑定DataView
如果你想沿用之前的转换代码,可以在加载DataGrid时就将EF查询结果转换为DataTable后绑定:
private void LoadDataGrid() { using (famloanEntities db = new famloanEntities()) { var ash = db.Ashkhas.ToList(); // 先转成DataTable再绑定DefaultView DataTable dt = ListToDataTable<Ashkhas>(ash); DataGrid1.ItemsSource = dt.DefaultView; } }
此时你之前的转换代码就可以正常运行:
DataTable dt = ((DataView)DataGrid1.ItemsSource).ToTable();
注意事项
- 如果你允许用户在界面修改DataGrid的内容,需要确保列绑定设置了
Mode=TwoWay,保证修改已经同步到数据源后再执行转换操作,避免拿到未更新的旧数据。
内容的提问来源于stack exchange,提问作者Ashkan
相关产品推荐
相关产品推荐

