2013-04-02 7 views
12

Ich benutze BackGroundWorker Klasse, um einige Werte in sqlserver einzufügen. Ich habe hier eine Schleife um Werte einzufügen. Ich verwende folgenden CodeEtikettentext im Hintergrund bearbeiten Arbeiter winforms

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

Wie ich den Text hier Label1 aktualisieren

Antwort

28

Dies sollte funktionieren die GUI von einem Hintergrund-Thread zu ändern.

7

Sie können auf UI-Schnittstellenobjekte nicht wie eine Beschriftung in einer DoWork-Methode zugreifen.
Die DoWork läuft auf einem anderen Thread als die UI-Elemente.
Sie müssen Ihre Schnittstelle über das ProgressChanged-Ereignis aktualisieren oder einen Delegaten aufrufen.

zuerst die WorkerReportsProgress Eigenschaft des Background auf True, dann der Aufruf an ReportProgress Methode wird das Ereignis erhöhen ProgressChanged, die im selben Thread Ihrer Interface-Elemente ausgeführt werden

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

Sie haben um das ProgressChanged-Event zu implementieren.

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; 
} 
+0

Und Sie können Userstate durch benutzerdefinierte Nachrichten aus Ihrem Ausführung von Code zu übergeben – Savage

2

// können Sie auch versuchen, dieses Update Ihr Label

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