在你的代碼,這條線會佔用大部分的處理時間:
SDA.Fill(DTGdataTable);
所以,我認爲最重要的事情是保持跟蹤的進步,而這是執行。要做到這一點,您首先需要知道您期望的行數。 SQLDataAdapter無法提供此信息,因此您需要首先運行額外的COUNT(*)查詢才能獲取此數字。然後,您可以將其用作ProgressBar上的最大值。
我的實際加載代碼是基於Michael Hofmeiers的解決方案,但我沒有在選取框模式下使用ProgressBar,而是使用來自定時器控件的實際進度數據。因此,在表單中,添加一個Timer控件(在我的示例中名爲progressTimer),將Interval設置爲100毫秒,並將Enabled設置爲false。然後,代碼變爲:
private DataTable table = null;
private void buttonLoad_Click(object sender, EventArgs e)
{
// TODO: Select the row count here and assign it to progressBar.Maximum
progressBar.Visible = true;
System.Threading.Thread thread =
new System.Threading.Thread(new System.Threading.ThreadStart(loadTable));
thread.Start();
progressTimer.Enabled = true;
}
private void loadTable()
{
// Load your Table...
this.table = new DataTable();
SqlDataAdapter SDA = new SqlDataAdapter();
SDA.Fill(table);
setDataSource(table);
}
internal delegate void SetDataSourceDelegate(DataTable table);
private void setDataSource(DataTable table)
{
// Invoke method if required:
if (this.InvokeRequired)
{
this.Invoke(new SetDataSourceDelegate(setDataSource), table);
}
else
{
progressTimer.Enabled = false;
dataGridView.DataSource = table;
progressBar.Visible = false;
}
}
private void progressTimer_Tick(object sender, EventArgs e)
{
if (this.table != null)
progressBar.Value = this.table.Rows.Count;
}
當你運行它,你的應用程序將加載過程中保持響應,你會看到進度變化,以反映裝載的行數。只有在最後(當您在DataGridView上設置DataSource時)應用程序纔會「掛起」,但我認爲沒有辦法避免這種情況。您只能從主線程執行此操作,因此無法避免UI無響應。但在我的測試中,DataGridView很容易在一秒鐘內處理300K +行,所以這應該不是什麼大問題。
[希望顯示動畫,而datagridview填充數據]的可能重複(http://stackoverflow.com/questions/6294374/want-to-show-animation-while-datagridview-is-filling-with-data ) – Shaharyar
如果你需要的只是用戶知道它正在加載,用'this.Cursor = Cursors.Wait;''this.Cursor = Cursors.Default;' – wruckie