2013-07-02 99 views
1

我有一個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; 
     } 

回答

0

DataSource屬性並不指望數據表。它是對象類型的,所以你可以使用任何列表作爲數據源。但在這種情況下,要能夠過濾它,你應該實現IBindingListView或使用BindingList。第二種情況當然更容易。看看here瞭解更多信息。

+0

謝謝你的洞察力。原諒我的愚蠢,但你的鏈接似乎只顯示創建一個新類的BindingList類。我似乎無法找到如何將列表轉換爲BindingList或構建BindingList linq查詢。 – Randy

+0

起初,我很抱歉讓您對BindingList的建議感到困惑。我檢查了它,它不工作。我現在看到的最簡單的方法是使用通用的BindingListView ,你可以在這裏找到(http://stackoverflow.com/a/5383203/1242916) – wunderbar