2010-04-15 2 views
9

//

BindingSource bs = new BindingSource(); 

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

// 관리자 클래스에서 내 양식에서 익명 Linq는 쿼리에서 윈폼 DataGridView를 채우기

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; 
} 
내가 윈폼에서 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

왜냐하면 ... 새로운 학생 인스턴스를 투영하기 때문입니다 ... 잘하고 있습니다. 명백하게). 모든 학생들의 모든 정보를 쉽게 얻을 수 있지만 읽기 전용이므로 일부 필드 만 있으면 런타임에 DataGrid보기를 채울 수 있습니다. – mdvaldosta

+0

코드와 수업을 보내 주셔서 감사합니다. – mdvaldosta

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

+0

글쎄, 익명 형식의 목록을 반환 할 수 없습니다,'List '을 객체 목록에 할당 할 수 없으므로 캐스트해야합니다. 어쨌든 GetStudents에서 실제 Student 객체를 반환하고 데이터 소스를 할당하기 전에 프로젝션을 수행하는 것이 더 좋을 것입니다. –

3

한 번 Gridview에서 결과를 표시 할 해결책을 찾았습니다. 내가 가진 문제는 DataGrid의 속성을 설정하는 것을 잊었다는 것입니다. Winform의 "데이터 소스"를 None으로 설정했습니다.

이 LINQ (단지 샘플 코드)와 디스플레이의 gridview에 대한 간단한 솔루션

DataGrid dataGrid1 = new DataGrid(); 

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

dataGrid1.DataSource = custQuery; 
+0

모든 고급 바인딩 관련 솔루션을 살펴보고 가장 간과 된 내용을 간과했습니다. 이 하나가 나를 위해 그것을 해결했습니다. 감사 – djv