2010-04-15 95 views
9

//來自我的表單從匿名Linq查詢填充WinForms DataGridView

BindingSource bs = new BindingSource(); 

private void fillStudentGrid() 
{ 
    bs.DataSource = Admin.GetStudents(); 
    dgViewStudents.DataSource = bs; 
} 

//來自Admin類

public static List<Student> GetStudents() 

{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    var query = 
     (from s in conn.Students 
     select new Student 
     { 
      ID = s.ID, 
      FirstName = s.FirstName, 
      LastName = s.LastName, 
      Belt = s.Belt 
     }).ToList(); 

    return query; 
} 

我正在嘗試在Winforms中填充datagridview控件,我只想要一些值。代碼編譯,但拋出運行時錯誤:

不允許在查詢中顯式構造實體類型「DojoManagement.Student」。

有沒有辦法讓它以這種方式工作?

回答

5

你已經有一個IEnumerable<Student>實例,你不能從原因描述here)查詢

你也不要」項目實體t需要創建一個列表來綁定到此數據源 - 您可以通過將其更改爲此來大大簡化您的方法:

public static IEnumerable<Student> GetStudents() 
{ 
    return new DojoDBDataContext().Students; 
} 

沒有理由將新實例投影到只映射一些屬性,通過執行查詢來返回所有值,並且投影不會爲您節省任何東西。如果你真的想只從這個查詢的信息的目的,返回幾個值躲在你可以這樣做:

public static IEnumerable<Object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    return conn.Students 
       .Select(s => new { 
        ID = s.ID, 
        FirstName = s.FirstName, 
        LastName = s.LastName, 
        Belt = s.Belt 
       }); 
} 

編輯:如果你不使用C#4你將不得不投的內容明確地將IEnumerable<T>改爲Object。只有C#4支持IEnumerable<T>的協方差。因此,如果您使用的是C#3,則必須這樣做:

public static IEnumerable<Object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    return conn.Students 
       .Select(s => new { 
        ID = s.ID, 
        FirstName = s.FirstName, 
        LastName = s.LastName, 
        Belt = s.Belt 
       }).Cast<Object>(); 
} 
+0

我正在投影新的Student實例,因爲......以及我並不真正知道自己在做什麼(明顯)。我可以很容易地從所有學生那裏獲得所有的信息,但是我只需要一些字段,並且在運行時填充datagrid視圖,因爲它是隻讀的。 – mdvaldosta 2010-04-15 16:48:09

+0

感謝您的代碼和課程。 – mdvaldosta 2010-04-15 17:02:00

1

只是返回一個匿名類型的對象的列表:

public static List<object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    var query = 
     (from s in conn.Students 
     select new 
     { 
      ID = s.ID, 
      FirstName = s.FirstName, 
      LastName = s.LastName, 
      Belt = s.Belt 
     }).Cast<object>().ToList(); 

    return query; 
} 
+0

大,的作品!儘管如此,我不禁想到還有比鑄造更好的方法。 – mdvaldosta 2010-04-15 16:52:18

+0

那麼,你不能返回一個匿名類型的列表,一個'List <匿名類型>'不能被分配給一個對象列表......所以你必須施放。無論如何,最好從GetStudents返回真實的Student對象,並且只在分配數據源之前執行投影 – 2010-04-15 17:19:13

3

一旦我四處尋找解決方案以在GridView上顯示結果, 我遇到的問題是我忘了在Winform中將datagrid的屬性設置爲None:「Data Source」。

這是顯示GridView的簡單的解決方案使用LINQ(只是示例代碼)

DataGrid dataGrid1 = new DataGrid(); 

var custQuery = 
    from cust in db.Customers 
    select cust; 

dataGrid1.DataSource = custQuery; 
+0

正在研究所有與高級綁定相關的解決方案,並忽略了最簡單的解決方案。這個爲我解決了。謝謝 – djv 2014-03-28 18:42:01