我有一个SQL数据库,我作为ADO.NET实体数据模型导入。然后我使用Linq填充DataGridView。我使用从其他表计算的额外列扩展了两个表。例如,我有一个表订单,其中包含OrderNumber,DateApproved和RequestorID等字段。我还有一个表,它是带有SKU,OrderNUmber和QuanityOrdered等字段的OrderDetails。我为Orders Table编写了一个新列IsBackOrdered,用于计算OrderDetails中的任何Item(SKU)是否需要延期交货。
当我将表Orders绑定到DataGridView.DataSource时,一切都按预期工作。然后我被指示为该表创建一个搜索过滤器。
我尝试将BindingSource映射到Linq查询,但BindingSource期待一个DataTable。我找到了一个简洁的小方法,将Linq ResultSet转换为DataTable(下面的代码)但是它在我的自定义字段(列)上的barfs:dr [pi.Name] = pi.GetValue(rec,null)?? DBNull.Value;
提前感谢您提供的任何观点或有用的见解。
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;
}
答案 0 :(得分:0)
BindingSource的DataSource属性不期望DataTable。它是类型对象,因此您可以使用任何列表作为数据源。但在这种情况下,为了能够过滤它,您应该实现IBindingListView或使用BindingList。第二种情况当然更容易。请查看here以获取更多信息。