2010-03-06 34 views
10

này rất khó hiểu, tôi sử dụng AsDataView để ràng buộc kết quả truy vấn đến một DGV và nó hoạt động tốt với những điều sau:Binding LINQ truy vấn để DataGridView

var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c; 
dataGridView1.DataSource = query.AsDataView(); 

Tuy nhiên, đây là một kết quả trong một Lỗi:

var query = from item in myDatabaseDataSet.Items 
    where item.p_Id == p_Id 
    join diamond in myDatabaseDataSet.Diamond 
     on item.p_Id equals diamond.p_Id 
    join category in myDatabaseDataSet.DiamondCategory 
     on diamond.dc_Id equals category.dc_Id 
    select new 
    { 
     Product = item.p_Name, 
     Weight = diamond.d_Weight, 
     Category = category.dc_Name 
    }; 

    dataGridView1.DataSource = query.AsDataView(); 

Lỗi:

Instance argument: cannot convert from 
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 
'System.Data.DataTable' 

AsDataView không hiển thị trong truy vấn (danh sách).. Tại sao điều này lại xảy ra? Làm thế nào để ràng buộc truy vấn ở trên vào dgv sau đó ?.

+0

Hãy xem liên kết này: [LINQ to DataTable] (http://weblogs.asp.net/stevesloka/archive/2008/01/28/linq-to-datatable.aspx) Có thể ở đây bạn có thể tìm thấy câu trả lời: [Loại lỗi chuyển đổi bằng LINQ với một Số liệu] (http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/bce2aced-2284-498a-b206-a9203cd19937) –

Trả lời

4

Chữ ký của AsDataView là như sau:

Tham số chỉ là DataTable.

Truy vấn bạn đang trả về IEnumerable thuộc loại ẩn danh không có chuyển đổi tiềm ẩn sang DataTable (hoặc chuỗi DataRow trường hợp, trong trường hợp này bạn có thể sử dụng để giúp bạn tạo DataTable).

Bạn cần lấy lại kết quả vào một DataTable hoặc một thứ gì đó mà bạn có thể chuyển đổi thành một DataTable và sau đó nó sẽ hoạt động.

Trong trường hợp cụ thể của bạn, có vẻ như bạn đã (hoặc đang) sử dụng typed DataSets. Nếu đó là trường hợp, thì bạn sẽ có thể lấy các giá trị đã được chọn và sau đó tạo các thể hiện DataRow mới (có các phương thức factory cho bạn), sau đó có thể được đưa vào một DataTable đã đánh máy, có thể gọi AsDataView .

+0

Cảm ơn nhưng tôi đã tìm kiếm một cách dễ dàng, một số phương pháp làm sẵn này không hoạt động. Vì vậy, tôi đoán tôi sẽ làm điều đó với SqlCeDataReader thay thế. – DanSogaard

+0

@DanSogaard: Tôi đã cập nhật câu trả lời của mình để phản ánh thực tế bạn đang sử dụng các tập dữ liệu đã nhập và cách bạn vẫn có thể sử dụng phương pháp mở rộng AsDataView. – casperOne

1

chỉ cần chuyển đổi kết quả thành danh sách và liên kết nó với lưới của bạn.

var query = from item in myDatabaseDataSet.Items 
    where item.p_Id == p_Id 
    join diamond in myDatabaseDataSet.Diamond 
     on item.p_Id equals diamond.p_Id 
    join category in myDatabaseDataSet.DiamondCategory 
     on diamond.dc_Id equals category.dc_Id 
    select new 
    { 
     Product = item.p_Name, 
     Weight = diamond.d_Weight, 
     Category = category.dc_Name 
    }.ToList(); 
dataGridView1.DataSource = query;