2012-11-01 45 views
0

我試圖執行一些需要很長時間並返回大量行的SQL查詢,這就是爲什麼我使用SqlDataReader來返回行。從另一個線程使用sqldatareader逐行填充DataGridView

我在單獨的線程中執行查詢,因此在返回行時UI將可用。

我也有一個數據表,我用SqlDataReader填充,並且DataTable綁定到BindingSource,並且BindingSource綁定到DataGridView。

問題是DataGridView似乎無法將DataTable的列綁定到DataGridView中的列,並且網格中的所有單元都顯示爲空白。即使AutoGenerateColumns = true,數據也不會顯示!

下面是一個例子代碼非常相似,我的問題:

public partial class Form2 : Form 
{ 
    BindingSource binding; 
    DataTable dt = new DataTable(); 
    DataGridView dgv; 

    public Form2() 
    { 
     InitializeComponent(); 

     binding = new BindingSource(); 
     binding.DataSource = dt; 

     dgv = new DataGridView(); 
     dgv.Columns.Add("Column1", "Column1"); 
     dgv.Columns[0].DataPropertyName = "Column1"; 
     dgv.AutoGenerateColumns = false; 
     dgv.DataSource = binding; 
     dgv.Click += new EventHandler(dgv_Click); 
     this.Controls.Add(dgv); 

     dostuff(); // ON FIRST TRY 5 ROWS SHOWN 
    } 

    void dgv_Click(object sender, EventArgs e) 
    { 
     dostuff(); // ON SECOND RUN EVERYTHING IS CLEARED! 
    } 

    void dostuff() 
    {    
     dgv.DataSource = null; 
     dt.Rows.Clear(); 
     dt.Columns.Clear(); 
     dgv.DataSource = binding; 

     BackgroundWorker bgw = new BackgroundWorker(); 
     bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); 
     bgw.RunWorkerAsync(); 

    } 

    void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     dt.Rows.Clear(); 
     dt.Columns.Clear(); 

     dt.Columns.Add("Column1"); 

     for (int i = 0; i < 5; i++) 
     { 
      DataRow r = dt.NewRow(); 
      r[0] = i; 
      dt.Rows.Add(r); 
     } 
    } 
} 
+0

這裏有一些代碼 – Jaska

回答

2

您需要刷新DataGridViewbgw_DoWork方法的末尾,你需要使用Invoke因爲Refresh方法必須在UI線程上運行。這裏是修改的bgw_DoWork方法:

void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    dt.Rows.Clear(); 
    dt.Columns.Clear(); 

    dt.Columns.Add("Column1"); 

    for (int i = 0; i < 5; i++) 
    { 
     DataRow r = dt.NewRow(); 
     r[0] = i; 
     dt.Rows.Add(r); 
    } 

    dgv.Invoke((MethodInvoker) delegate() { dgv.Refresh(); }); 
} 
+0

我發現跨線程控制修改的最佳解決方案是你的。謝謝。 – Gholamalih