Ответ 1
Это должно сработать для изменения GUI из фонового потока.
Label1.Invoke((MethodInvoker)delegate {
Label1.Text = i.ToString() + "Files Converted";});
Я использую класс BackGroundWorker для вставки некоторых значений в sqlserver. У меня есть цикл для ввода значений. Я использую следующий код
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.
}
}
Как я могу обновить текст Label1 здесь
Это должно сработать для изменения GUI из фонового потока.
Label1.Invoke((MethodInvoker)delegate {
Label1.Text = i.ToString() + "Files Converted";});
Вы не можете получить доступ к объектам интерфейса интерфейса UI, таким как метка внутри метода DoWork.
DoWork работает в другом потоке, чем элементы пользовательского интерфейса.
Вам необходимо обновить интерфейс через событие ProgressChanged или вызвать делегата.
Сначала установите для свойства WorkerReportsProgress
значение BackgroundWorker равным True,
то вызов метода ReportProgress
поднимет событие ProgressChanged
, которое будет запущено в том же потоке элементов интерфейса.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Label1.Text = e.ProgressPercentage.ToString();
}
Необходимо выполнить событие ProgressChanged.
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;
}
//Вы также можете попробовать это обновление своей метки
this.Invoke(new MethodInvoker(delegate
{
Label1.Text = i.ToString() + "Files Converted";
}));