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
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";});
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();
}
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;
}
// Vous pouvez également essayer cette mise à jour de votre étiquette
this.Invoke(new MethodInvoker(delegate
{
Label1.Text = i.ToString() + "Files Converted";
}));
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();