I'm working on a c# Window Forms project, .Net framework 4.7.2
Main form has 3 controls: datagridview1, button1 and panel1 (with a progressBar inside panel1). There is no autosize in columns and rows of datagridview.
On button click, a very large datatable is retrieved in an asyncronous way from a database. Datatable is then bound to my datagridview, but user interface becomes frozen, while I would like it to be active.
Example code is:
public Form1()
{
InitializeComponent();
dataGridView1.Dock = DockStyle.Fill;
panel1.Visible = false;
panel1.Dock = DockStyle.Bottom;
button1.Dock = DockStyle.Top;
//progressBar1 is inside panel1
progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.Dock = DockStyle.Fill;
panel1.BringToFront();
dataGridView1.BringToFront();
}
private DataTable GetDataTable()
{
//Datatable is retrieved from a database indeed, with long-time queries.
DataTable dt = new DataTable();
for (int k = 0; k < 600; k++) dt.Columns.Add(k.ToString());
for (int r = 0; r < 100; r++)
{
DataRow newRow = dt.NewRow();
for (int c = 0; c < 600; c++) newRow[c] = r.ToString() + c.ToString();
dt.Rows.Add(newRow);
}
return dt;
}
private async void button1_Click(object sender, EventArgs e)
{
panel1.Visible = true;
DataTable dt = null;
await Task.Run(() =>
{
dt = GetDataTable();
});
dataGridView1.DataSource = dt; //it takes time to draw (many cells). UI is frozen: progressbar value remain fixed
panel1.Visible = false;
}
I know that standard datagridview control is not good for large datasets, but we have to use it.
Is there any best practice to have my user interface (my progressbar indicator) active while a large datagridview is rendering?
Thanks
Edit: As suggested by dr.null, I have used System.Windows.Forms.Timer. Code is:
private async void button1_Click(object sender, EventArgs e)
{
panel1.Visible = true;
Timer timer = new Timer();
timer.Interval = (10); // 10 millisecs
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
DataTable dt = null;
await Task.Run(() =>
{
dt = GetDataTable(); //it takes time but it is on a different task. UI is not frozen
});
dataGridView1.DataSource = dt; //it takes time to draw (many cells). UI is frozen: progressbar value remain fixed. How to view progressbar active while datagridview is rendering?
timer.Stop();
timer.Tick -= new EventHandler(timer_Tick);
panel1.Visible = false;
}
private void timer_Tick(object sender, EventArgs e)
{
panel1.Refresh();
}