2012-09-17 35 views
1

我已經添加了所需的列和正確的DataPropertyName,並使用以下代碼填充datagridview。但是,我的dataGridView只顯示列標題和一個空行。我的代碼有什麼問題?如何使用IQueryable填充dataGridView

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

如果你調用'dataGridView1.DataBind()'和/或'.kolonlistele()會發生什麼。ToList()' – Nate

+0

錯誤 'System.Windows.Forms.DataGridView' 不包含「的DataBind的定義',並且沒有找到接受'System.Windows.Forms.DataGridView'類型的第一個參數的擴展方法'DataBind'(你是否缺少using指令或程序集引用?) – 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(); 
    } 
} 

通過調用ToList內的數據源被設置之前執行查詢的using。另外請注意,我刪除了from k in ctx.Kolons select k,因爲它實際上並沒有完成任何操作。這完全是多餘的。

您的其他選擇是增加數據源的範圍。如果不是在kolonlistele方法中聲明數據源,而是在「更高範圍」聲明數據源,以便數據源已設置,而對象尚未處理,那麼它也可以工作。如果數據源的創建成本更高,或者查詢的大小非常大以至於流式傳輸很重要(如果需要流式傳輸數據然後熱切地將其評估爲List),那麼這將更合適一個問題)。

+0

我明白了你的觀點。那麼你能告訴我一種方法來填充datagridview,並能夠在datagridview上更新數據嗎? – Hasan

+0

@HananAyan這將是一個你需要使用我提到的第二個解決方案的例子。您需要增加datacontext的範圍,以便在您完成使用之前不會處理它。如果你想使用同一個進行更新,那麼它可能意味着將它作爲一個實例字段,並在'Form'處理方法中手動處理,而不是通過'using'處理。 – Servy

+0

我已經完成了你所說的話,我現在不處理它。但是如果我沒有調用.ToList(),它將顯示沒有數據。 – Hasan