我有一個SQL數據庫,我作爲一個ADO.NET實體數據模型導入。然後我使用Linq填充DataGridView。我使用從其他表格計算出的額外列擴展了兩個表。例如,我有一個表Order的字段爲OrderNumber,DateApproved和RequestorID等等。我也有一個表是OrderDetails的字段,如SKU,OrderNUmber和QuanityOrdered。我爲Orders表編寫了一個新的IsBackOrdered列,用於計算OrderDetails中的任何Item(SKU)是否是延期交貨。Linq ResultSet到DataTable
當我綁定表時訂單到DataGridView.DataSource一切都按預期工作。然後我被指示爲表格創建一個搜索過濾器。
我試圖將BindingSource映射到Linq查詢,但BindingSource期待DataTable。我發現了一個整潔的小方法,可以將Linq ResultSet轉換爲DataTable(下面的代碼),但它會在我的自定義字段(Columns)上的bar欄處顯示:dr [pi.Name] = pi.GetValue(rec,null)?? DBNull.Value;
在此先感謝您提供的任何看法或有用的見解。 BindingSource的的
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;
}
謝謝你的洞察力。原諒我的愚蠢,但你的鏈接似乎只顯示創建一個新類的BindingList類。我似乎無法找到如何將列表轉換爲BindingList或構建BindingList linq查詢。 – Randy
起初,我很抱歉讓您對BindingList的建議感到困惑。我檢查了它,它不工作。我現在看到的最簡單的方法是使用通用的BindingListView,你可以在這裏找到(http://stackoverflow.com/a/5383203/1242916) –
wunderbar