2012-09-17 5 views
1

필수 열을 추가하고 DataPropertyName을 오른쪽에 추가하고 다음 코드를 사용하여 DataGridview를 채 웁니다. 그러나 내 dataGridView는 열 머리글과 빈 행 하나만 표시합니다. 내 코드에 어떤 문제가 있습니까?DataGridView에 IQueryable을 채우는 방법

public static IQueryable<Kolon> kolonlistele() 
{ 
    using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities()) 
    { 
     var result = from k in ctx.Kolons 
        select k; 

     return result; 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    dataGridView1.DataSource = veritabani_islemleri.kolonlistele(); 
} 
+0

. ToList()' – Nate

+0

오류 'System.Windows.Forms.DataGridView는'데이터 바인딩 '에 대한 정의가 포함되어 있지 않습니다 '및'System.Windows.Forms.DataGridView '형식의 첫 번째 인수를 받아들이는 확장 메서드'DataBind '를 찾을 수 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – Hasan

+0

.ToList()가 작동합니다. 그러나 그것은 내가 원하는 것이 아닙니다. dataGridView에서 데이터를 업데이트 할 수 있어야합니다. – Hasan

답변

5

여기서 지연 문제가 있습니다. result은 실제로 결과가 아닙니다. 쿼리의 결과가 아니라 쿼리 자체 일뿐입니다. 그게 IQueryable입니다. 결과 집합이 아닌 SQL 쿼리의 복잡한 버전이라고 생각할 수 있습니다. 실제 쿼리는 반복 할 때까지 실행되지 않거나 반복 할 때까지 실행되지 않습니다. 예를 들어 ToList을 호출하고 foreach에 넣거나 여기 에서처럼 DataGridView에 바인딩합니다.

이 지연 실행은 일회용 리소스가 관련되어 있기 때문에 특히 문제가됩니다. using 블록 외부에있을 때까지 실제로 쿼리를 실행하지 않습니다. 즉, 실제로 쿼리를 실행하려고 할 때 DataSource이 처리되었습니다. 이러한 문제를 해결하기

한가지 방법은 열심히 쿼리를 실행하는 것이다 :

public static IQueryable<Kolon> kolonlistele() 
{ 
    using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities()) 
    { 
     return ctx.Kolons.ToList(); 
    } 
} 

데이터 소스가 배치되기 전에 쿼리가 실행된다 using의 내부 ToList호출하여. 또한 실제로 아무 것도 수행하지 않기 때문에 from k in ctx.Kolons select k을 제거했습니다. 그것은 완전히 중복됩니다.

다른 옵션은 데이터 소스의 범위를 늘리는 것입니다. kolonlistele 메서드 내부에서 선언하는 대신 데이터 소스가 설정되어있는 동안 개체가 아직 처리되지 않은 상태에서 "상위 범위"에서 선언 된 경우 작동합니다. 데이터 소스가 더 비싸고 쿼리의 크기가 너무 커서 스트림을 스트리밍하는 것이 중요 할 경우 (데이터를 스트리밍해야한다면 List으로 열심히 평가할 수 있습니다.) 문제).

당신은`dataGridView1.DataBind을() '및/또는'.kolonlistele()를 호출하면 어떻게됩니까
+0

나는 당신의 요점을 알아 냈다. DataGridview를 채우고 DataGridview에서 데이터를 바로 업데이트 할 수있는 방법을 알려주시겠습니까? – Hasan

+0

@HasanAyan 그것은 제가 언급 한 두 번째 해결책을 사용해야 할 때가 된 예입니다. datacontext의 범위를 늘려서 사용이 끝날 때까지 처리하지 않도록해야합니다. 만약 업데이트를 위해서 같은 것을 사용하기를 원한다면 인스턴스 필드로 만들고 그것을'using'이 아닌'Form' dispose 메쏘드에 수동으로 처리하는 것을 의미 할 것입니다. – Servy

+0

나는 말한 것을 해냈다. 나는 지금 그것을 처분하지 않을 것이다. 그러나 .ToList()를 호출하지 않으면 데이터가 표시되지 않습니다. – Hasan

관련 문제