2012-11-01 41 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