2009-05-19 36 views
0

我有一個網格的DevExpress(DevExpress.XtraGrid.GridControl 8.2)與在運行時設置像這樣一個數據源:LINQ和DevExpress的網格數據源

private DataContext db = new DataContext("connection string"); 
gridControl.DataSource = from t in db.sometable 
          select new 
          { 
           Field1 = t.Name, 
           Field2 = t.Email, 
           Field3 = t.City 
          }; 

這意味着該視圖有不知道數據是怎麼回事看起來像在設計時間。我喜歡能夠將LINQ查詢設置爲數據源,但我也想指定在設計時視圖的樣子。

  • 有沒有一種方法可以告訴視圖它將使用此查詢?
  • 最好的解決方案是創建一個小對象來保存 這個查詢返回的內容 ?

回答

2

如果您希望DevExpress網格自動選取數據源的列,您將必須爲LINQ查詢的返回類型定義一個類。在設計時,如果源實現自動發現數據源的屬性及其類型等,則WinForm綁定引擎使用反射或ICustomTypeDescriptor。 DevExpress網格正在使用此基礎綁定機制,並根據屬性信息在設計時自動爲您生成列。然而,在你的情況下,你正在LINQ查詢中創建一個匿名類型,這在設計時是未知的或不可用的。因此,DevExress Grid不能自動生成列。正如@丹尼斯提到的,您可以在設計器中手動添加列到網格中。您需要確保列上的'FieldName'與我的數據源上的屬性名稱匹配。

如果您使用類,您可能還需要實現INotifyPropertyChanged以使網格知道數據源中的數據更改。

0

我還沒有與DevExpress網格一起工作,但我已經使用.NET DataGridView做了很多工作。

DevExpress網格是否具有與自動生成列的.NET DataGridView相同的功能?

如果是這樣,那麼它應該顯示在您的查詢中找到的任何字段,並將Field1,Field2和Field3(來自示例代碼)作爲列名。

或者只是關閉自動生成列功能並在設計時添加列。只要它們與你的查詢返回的內容匹配,它應該可以正常工作。

1

IIRC,xtragrid要求數據源實現一個數據綁定接口(即IBindingList(T))以便自動生成列,並且這些項目應實現INotifyPropertyChanged。

考慮到這一點:如果在設計時或在運行時通過嚮導創建列,只要設置了列的FieldName屬性,它們就會顯示數據源中的數據,其屬性爲那個名字。

注:

  • 我認爲它必須是一個屬性,自動與否,我發現它有時會不綁定到公共變量。
  • 該屬性必須分配一些東西(默認或其他)。
  • 該項目必須有一個無參數的構造函數。
1

該字段在設計時已知(Field1,Field2,Field3)。

根據DevExpress,您可以使用IList,IListSource,ITypedListIBindingList。它們之間的區別在於您是否可以添加新行或者是否改變了控件。

所以,你可以使用ToList():

private DataContext db = new DataContext("connection string"); 
gridControl.DataSource = (from t in db.sometable 
         select new 
         { 
          Field1 = t.Name, 
          Field2 = t.Email, 
          Field3 = t.City 
         }).ToList(); 

注意:我測試了它使用的DevExpress 10.1,但如果它使用WinForms binding那麼它仍然應該根據MSDN工作。