2013-04-02 15 views
12

我正在使用BackGroundWorker類在sqlserver中插入一些值。我有for循環在這裏插入值。我使用下面的代碼更新後臺工作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.     
     }  
    } 

我如何更新在這裏

回答

28

這應該工作到GUI從後臺線程改變的Label1文本。

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

您不能像DoWork方法中的標籤那樣訪問UI界面對象。
DoWork在與UI元素不同的線程上運行。
您需要通過ProgressChanged事件或調用委託更新您的接口。

首先BackgroundWorker的的WorkerReportsProgress屬性設置爲True, 然後,調用ReportProgress方法,將提高,這將在你的界面元素的同一個線程運行的事件ProgressChanged

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

你有實施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; 
} 
+0

你也可以使用UserState從你的執行代碼通過自定義郵件傳遞 – Savage

2

//你也可以試試這個更新您的標籤

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