2010-04-15 647 views
9

// Từ hình thức của tôiĐiền WinForms DataGridView Từ Anonymous LINQ Query

BindingSource bs = new BindingSource(); 

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

// Từ lớp Quản trị

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; 
} 

Tôi đang cố gắng để điền vào một điều khiển DataGridView trong Winforms, và tôi chỉ muốn một vài giá trị. Mã biên dịch, nhưng ném một lỗi thời gian chạy:

Xây dựng rõ ràng loại thực thể 'DojoManagement.Student' trong truy vấn không được phép.

Có cách nào để hoạt động theo cách này không?

Trả lời

5

Bạn đã có một thể hiện IEnumerable<Student> và bạn không thể dự án tổ chức từ một truy vấn vì những lý do mô tả here)

Bạn cũng don' t cần tạo danh sách để liên kết với nguồn dữ liệu này - bạn có thể đơn giản hóa rất nhiều phương pháp của mình bằng cách thay đổi nó thành:

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

Không có lý do gì để chiếu một thể hiện mới để chỉ ánh xạ một vài thuộc tính, bằng cách thực hiện truy vấn bạn trả về tất cả các giá trị dù sao đi nữa và phép chiếu của bạn không giúp bạn tiết kiệm được gì. Nếu bạn thực sự muốn chỉ trả lại một vài giá trị từ truy vấn này nhằm mục đích che giấu thông tin bạn có thể làm điều này:

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 
       }); 
} 

Edit: Nếu bạn không sử dụng C# 4 bạn sẽ phải bỏ nội dung của số IEnumerable<T> đến Object một cách rõ ràng. Chỉ C# 4 hỗ trợ hiệp phương sai cho IEnumerable<T>. Vì vậy, nếu bạn đang sử dụng C# 3, bạn sẽ phải làm điều này:

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

Tôi đang chiếu một cá thể Sinh viên mới vì ... tôi thực sự không biết mình đang làm gì (chắc chắn). Tôi có thể nhận được tất cả các thông tin từ tất cả các sinh viên một cách dễ dàng, nhưng tôi chỉ CẦN một vài trong số các lĩnh vực và đang điền vào xem datagrid tại thời gian chạy như nó chỉ đọc. – mdvaldosta

+0

Cảm ơn mã và bài học. – mdvaldosta

1

Chỉ cần trả về một danh sách các đối tượng của một loại vô danh:

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

Tuyệt vời, mà làm việc! Tôi không thể không nghĩ rằng có một cách tốt hơn so với đúc mặc dù. – mdvaldosta

+0

Vâng, bạn không thể trả về một danh sách của một loại vô danh, một 'List ' không thể được gán cho một danh sách các đối tượng ... vì vậy bạn phải cast. Dù sao, nó có lẽ sẽ tốt hơn để trả lại các đối tượng Sinh viên thực sự từ GetStudents và chỉ thực hiện phép chiếu trước khi bạn gán nguồn dữ liệu –

3

Khi tôi đang tìm kiếm giải pháp để hiển thị kết quả trên Gridview. Vấn đề tôi gặp phải là tôi quên đặt thuộc tính datagrid: "Data Source" thành None trên Winform.

Đây là giải pháp đơn giản để hiển thị GridView với LINQ (chỉ mẫu mã)

DataGrid dataGrid1 = new DataGrid(); 

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

dataGrid1.DataSource = custQuery; 
+0

Đã xem xét tất cả các giải pháp liên quan đến ràng buộc nâng cao và bị bỏ qua đơn giản nhất. Cái này giải quyết nó cho tôi. Cảm ơn – djv