2013-04-02 4 views
12

में लेबल टेक्स्ट अपडेट करें मैं sqlserver में कुछ मान डालने के लिए BackGroundWorker क्लास का उपयोग कर रहा हूं। मेरे पास मूल्य डालने के लिए यहां लूप के लिए है। मैं निम्नलिखित कोड का उपयोग कर रहाबैकग्राउंड वर्कर 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.     
     }  
    } 

मैं कैसे Label1 पाठ यहाँ

उत्तर

28

यह एक पृष्ठभूमि धागे से जीयूआई को बदलने के लिए काम करना चाहिए अद्यतन कर सकते हैं।

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

आप यूओ इंटरफ़ेस ऑब्जेक्ट्स को DoWork विधि के अंदर किसी लेबल की तरह एक्सेस नहीं कर सकते हैं।
DoWork यूआई तत्वों की तुलना में एक अलग थ्रेड पर चल रहा है।
आपको प्रोग्रेस चेंज किए गए ईवेंट के माध्यम से या एक प्रतिनिधि को कॉल करने के माध्यम से अपना इंटरफ़ेस अपडेट करना होगा।

सबसे पहले सही पर BackgroundWorker का WorkerReportsProgress गुण सेट, तो, ReportProgress विधि करने के लिए कॉल, घटना ProgressChanged कि आपके इंटरफ़ेस तत्वों का एक ही धागे में चलेंगे, जो बढ़ा देंगे

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

आपके पास प्रोग्रेस चेंज-इवेंट को लागू करने के लिए।

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"; 
      }));