All'interno del codice, questa linea prenderà la maggior parte del tempo di elaborazione:
SDA.Fill(DTGdataTable);
Quindi penso che la cosa più importante è quello di tenere traccia dei progressi, mentre questo è in esecuzione. Per fare ciò, devi prima sapere quante file ti aspetti. SQLDataAdapter non può fornire queste informazioni, quindi è necessario eseguire prima una query COUNT (*) extra per ottenere questo numero. Puoi quindi usarlo come Massimo sul tuo ProgressBar.
Il mio codice di caricamento effettivo si basa sulla soluzione di Michael Hofmeiers, ma invece di utilizzare ProgressBar in modalità Marquee, lo alimenterei con dati di avanzamento reali da un controllo timer. Quindi nel tuo modulo, aggiungi un controllo Timer (denominato progressTimer nel mio esempio), imposta il suo Intervallo su 100 msec e Abilitato su falso. Il codice diventa allora:
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;
}
Quando si esegue questo, l'applicazione rimarrà reattivo durante il caricamento, e vedrete la ProgressBar cambia per riflettere il numero di righe caricate. Solo alla fine (quando si imposta DataSource su DataGridView) l'applicazione sembrerà "bloccata", ma non penso che ci sia un modo per evitarlo. Puoi eseguire questa operazione solo dal thread principale, quindi è inevitabile che l'interfaccia utente non risponda. Ma nel mio test, DataGridView gestisce facilmente le righe 300K + in circa un secondo, quindi questo non dovrebbe essere un grosso problema.
fonte
2014-02-03 01:50:25
possibile duplicato di [Vuoi mostrare l'animazione mentre datagridview sta riempiendo di dati] (http://stackoverflow.com/questions/6294374/want-to-show-animation-while-datagridview-is-filling-with-data) – Shaharyar
Se tutto ciò che serve è che l'utente sappia che sta caricando, avvolgi il tuo codice con 'this.Cursor = Cursors.Wait;' 'this.Cursor = Cursors.Default;' –
wruckie