web-dev-qa-db-fra.com

Mettre à jour le texte d'étiquette dans les formulaires de travail de fond

J'utilise la classe BackGroundWorker pour insérer des valeurs dans sqlserver. J'ai pour boucle ici pour insérer des valeurs. J'utilise le code suivant

 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.                  
        }    
    }

Comment puis-je mettre à jour le texte Label1 ici 

13
Rajeev Kumar

Cela devrait fonctionner pour changer l'interface graphique à partir d'un thread en arrière-plan.

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

Vous ne pouvez pas accéder aux objets d'interface utilisateur comme une étiquette dans une méthode DoWork.
DoWork s'exécute sur un thread différent de celui des éléments de l'interface utilisateur.
Vous devez mettre à jour votre interface via l'événement ProgressChanged ou en appelant un délégué.

Définissez d'abord la propriété WorkerReportsProgress de BackgroundWorker sur True, , Puis l'appel de la méthode ReportProgress, déclenchera l'événement ProgressChanged qui sera exécuté dans le même fil de vos éléments d'interface. 

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

Vous devez implémenter 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;
}
3
Tomtom

// Vous pouvez également essayer cette mise à jour de votre étiquette 

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

J'avais le même problème. J'étais déjà dans l'événement de travailleur de fond Progress Modified, mais même utiliser les deux versions de Method Invoker ci-dessus n'a pas aidé. Ensuite, j'ai essayé ceci et cela a fonctionné:

 lblCount.Text = string.Format("Total Directories: {0} Total Files: {1}", TotalDirectories, TotalFiles);
 lblCount.Update();
0
Anthony Griggs