1

我有一个作为 ADO.NET 实体数据模型导入的 SQL 数据库。然后我使用 Linq 填充 DataGridView。我用从其他表计算的额外列扩展了两个表。例如,我有一个表 Orders,其中包含 OrderNumber、DateApproved 和 RequestorID 等字段。我还有一个表是 OrderDetails,其中包含 SKU、OrderNUMber 和 QuanityOrdered 等字段。我为 Orders 表编写了一个新列 IsBackOrdered,用于计算 OrderDetails 中的任何 Item(SKU) 是否延期交货。

当我将表 Orders 绑定到 DataGridView.DataSource 时,一切都按预期工作。然后我被指示为该表创建一个搜索过滤器。

我试图将 BindingSource 映射到 Linq 查询,但 BindingSource 需要一个 DataTable。我找到了一个巧妙的小方法,可以将 Linq ResultSet 转换为 DataTable(下面的代码),但是它会在我的自定义字段(列)上显示这一行: dr[pi.Name] = pi.GetValue(rec, null) ?? DBNull.值;

提前感谢您提供的任何观点或有用的见解。

public static DataTable LinqToDataTable<T>(IEnumerable<T> varlist)
        {
            var dtReturn = new DataTable();

            // column names
            PropertyInfo[] oProps = null;

            if (varlist == null)
                return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others will follow
                if (oProps == null)
                {
                    oProps = rec.GetType().GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) ?? DBNull.Value;
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }
4

1 回答 1

0

BindingSource 的 DataSource 属性不需要 DataTable。它是对象类型,因此您可以使用任何列表作为数据源。但在这种情况下,为了能够过滤它,您应该实现 IBindingListView 或使用 BindingList。第二种情况当然更简单。在这里查看更多信息。

于 2013-07-02T16:18:47.583 回答