我試圖執行一些需要很長時間並返回大量行的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);
}
}
}
這裏有一些代碼 – Jaska