Debugging?
Or if you don't want the user to click your DGV, hide the window and show it again after the download.
ddanbe
Senior Poster
3,829 posts since Oct 2008
Reputation Points: 2,070
Solved Threads: 661
Sounds like you might be doing the download in the UI thread.
If this is the case then the whole UI is probably hung waiting for the download to finish.
The easiest way to manage a big task in a windows forms app is to use a BackgroundWorker.
The code sample below shows how to use one and get feedback when it finishes.
private void button1_Click(object sender, EventArgs e)
{
var bgw = new System.ComponentModel.BackgroundWorker();
bgw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerAsync();
}
void bgw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
// execute the big task
BigTask();
}
void bgw_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
// Report big task done
MessageBox.Show("Task Done.");
}
private void BigTask()
{
for (int i = 0; i < 50; i++)
{
System.Threading.Thread.Sleep(100);
}
}
nick.crane
Nearly a Posting Virtuoso
1,230 posts since Feb 2010
Reputation Points: 375
Solved Threads: 187
Here is what you can do:
I would use a backgroundworker, and do the download work in it:
private delegate void DownloadDelegate(string msg);
private BackgroundWorker bgv;
public Form1()
{
InitializeComponent();
//create bgv:
bgv = new BackgroundWorker();
bgv.ProgressChanged += new ProgressChangedEventHandler(bgv_ProgressChanged);
bgv.DoWork += new DoWorkEventHandler(bgv_DoWork);
bgv.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgv_RunWorkerCompleted);
//label will be used as a note of a progress
label1.Text = "";
//creating columns:
DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
btnColumn.HeaderText = "Dowload";
btnColumn.Name = "column2";
btnColumn.Text = "download";
btnColumn.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add("column1", "Text Name");
dataGridView1.Columns.Add(btnColumn);
//adding some example rows:
for (int i = 1; i < 6; i++)
dataGridView1.Rows.Add("Test number " + i);
//adding event:
dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dataGridView1.Columns["column2"].Index)
{
//disable dgv until download runs our:
//dataGridView1.Enabled = false;
bgv.RunWorkerAsync();
//disable dgv:
dataGridView1.Enabled = false;
}
}
void bgv_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Error == null))
label1.Text = "Error: " + e.Error.Message;
else
{
label1.Text = "Done!";
//enable dgv:
dataGridView1.Enabled = true;
}
}
void bgv_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
//
//THIS IS WHERE YOU PUT YOUR DOWNLOAD CODE!!!
//
//this is only my example code of time consuming:
int total = 50; //some variable
for (int i = 0; i < total; i++)
{
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
worker.ReportProgress((100 * i) / total);
//stop a bit:
System.Threading.Thread.Sleep(50);
}
}
void bgv_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = " Download progress: " + e.ProgressPercentage.ToString() + " %";
}
Mitja Bonca
Nearly a Posting Maven
2,485 posts since May 2009
Reputation Points: 641
Solved Threads: 474