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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:57:02