Подтвердить что ты не робот

Обновить текст ярлыка в фоновых рабочих winforms

Я использую класс 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 здесь

4b9b3361

Ответ 1

Это должно сработать для изменения GUI из фонового потока.

Label1.Invoke((MethodInvoker)delegate {
   Label1.Text = i.ToString() + "Files Converted";});

Ответ 2

Вы не можете получить доступ к объектам интерфейса интерфейса UI, таким как метка внутри метода DoWork.
DoWork работает в другом потоке, чем элементы пользовательского интерфейса.
Вам необходимо обновить интерфейс через событие ProgressChanged или вызвать делегата.

Сначала установите для свойства WorkerReportsProgress значение BackgroundWorker равным True, то вызов метода ReportProgress поднимет событие ProgressChanged, которое будет запущено в том же потоке элементов интерфейса.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
     Label1.Text = e.ProgressPercentage.ToString();
}

Ответ 3

Необходимо выполнить событие 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;
}

Ответ 4

//Вы также можете попробовать это обновление своей метки

this.Invoke(new MethodInvoker(delegate 
          {
             Label1.Text = i.ToString() + "Files Converted";
          }));