Reputation: 4963
I am using BackGroundWorker class to insert some values in sqlserver. I have for loop here to insert values. i am using following code
public void bw_Convert_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = e.Argument;
for (int i = 0; i < fTable.Rows.Count; i++)
{
try
{
SqlCommand cmd = new SqlCommand("INSERT INTO TBL_CDR_ANALYZER (LNG_UPLOAD_ID, DAT_START, LNG_DURATION, INT_DIRECTION, INT_CALL_DATA_TYPE, \n" +
"TXT_TARGET_NUMBER, TXT_OTHER_PARTY_NUMBER, TXT_TARGET_IMSI, TXT_TARGET_IMEI, TXT_TARGET_CELL_ID, TXT_ROAMING_NETWORK_COMPANY_NAME) VALUES \n" +
"(@UPLOAD_ID, @START_DATE, @DURATION, @DIRECTION, @CALL_TYPE, @TARGET_NUMBER, @OTHER_PARTY_NUMBER, @IMSI, @IMEI, @CELL_ID, @ROAMING_NAME)", sqlCon);
cmd.Parameters.Add("@UPLOAD_ID", SqlDbType.Int).Value = 1;
cmd.Parameters.Add("@START_DATE", SqlDbType.DateTime).Value = fTable.Rows[i]["CallDate"];
cmd.Parameters.Add("@DURATION", SqlDbType.Int).Value = fTable.Rows[i]["CallDuration"];
cmd.Parameters.Add("@DIRECTION", SqlDbType.Int).Value = GetCallDirection(fTable.Rows[i]["CallDirection"].ToString());
cmd.Parameters.Add("@CALL_TYPE", SqlDbType.Int).Value = GetCallType(fTable.Rows[i]["CallType"].ToString());
cmd.Parameters.Add("@TARGET_NUMBER", SqlDbType.VarChar, 25).Value = fTable.Rows[i]["TargetNo"];
cmd.Parameters.Add("@OTHER_PARTY_NUMBER", SqlDbType.VarChar, 25).Value = fTable.Rows[i]["OtherPartyNo"];
cmd.Parameters.Add("@IMSI", SqlDbType.VarChar, 50).Value = fTable.Rows[i]["IMSI"];
cmd.Parameters.Add("@IMEI", SqlDbType.VarChar, 50).Value = fTable.Rows[i]["IMEI"];
cmd.Parameters.Add("@CELL_ID", SqlDbType.VarChar, 50).Value = fTable.Rows[i]["CellID"];
cmd.Parameters.Add("@ROAMING_NAME", SqlDbType.NVarChar, 255).Value = fTable.Rows[i]["RoamingCompany"];
sqlCon.Open();
cmd.ExecuteNonQuery();
sqlCon.Close();
}
catch (SqlException ex)
{
}
finally
{
sqlCon.Close();
}
bw_Convert.ReportProgress((100 * i) / fTable.Rows.Count);
**Label1.Text = i.ToString() + "Files Converted";** // getting error Here.
}
}
How can i update the Label1 text here
Upvotes: 15
Views: 33252
Reputation: 1641
I was having the same issue. I was already within the Progress Changed Background Worker Event but even using both versions of the Method Invoker above did not help. Then I tried this and it worked:
lblCount.Text = string.Format("Total Directories: {0} Total Files: {1}", TotalDirectories, TotalFiles);
lblCount.Update();
Upvotes: 0
Reputation: 21
//You can also try this update your label
this.Invoke(new MethodInvoker(delegate
{
Label1.Text = i.ToString() + "Files Converted";
}));
Upvotes: 2
Reputation: 9394
You have to implement the ProgressChanged-Event.
private void bw_Convert_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//The progress in percentage
int progress = e.ProgressPercentage;
//A custom-value you can pass by calling ReportProgress in DoWork
object obj = e.UserState;
}
Upvotes: 3
Reputation: 216273
You can't access UI interface objects like a label inside a DoWork method.
The DoWork is running on a different thread than the UI elements.
You need to update your interface through the ProgressChanged event or calling a delegate.
First set the WorkerReportsProgress
property of the BackgroundWorker to True,
then, the call to ReportProgress
method, will raise the event ProgressChanged
that will be run in the same thread of your interface elements
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Label1.Text = e.ProgressPercentage.ToString();
}
Upvotes: 7
Reputation: 4182
This should work to change the GUI from a background thread.
Label1.Invoke((MethodInvoker)delegate {
Label1.Text = i.ToString() + "Files Converted";});
Upvotes: 34