2016-11-24 57 views
0

我使用後臺工作器在C#中生成報告,但我收到此錯誤。在C#中生成報告導致錯誤

enter image description here

源代碼如下:

  • 我要訪問我的datagridview記錄來訪問它的數據。
  • 在我的datagridview中打開一個小窗口,要求用戶輸入日期並生成報告,然後訪問我的datagridview轉換爲數據表寫入XML文件並生成報告。

全局變量

// This is the form where the data lies, I'm accessing it's instance. 
      Records TR = new Records(); 
// This is the form where report will be displayed. 
      TReportDisplay TRD = new TReportDisplay(); 
// This is the report. 
      Treport treport1 = new Treport(); 

    private void button1_Click(object sender, EventArgs e) 
     { 
      // FIXED HERE - 1 
      // FIXED - 2 IN THE ANSWER BELOW. 
     // Accessing my DataGridView Form Instance. 
      TR = Application.OpenForms.OfType<Records>().ElementAt(0); 
      treport1.SetDataSource(TR.ds); 
      TRD.crystalReportViewer2.ReportSource = treport1; 

      backgroundWorker1.RunWorkerAsync(); 
     } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 

     try 
     { 

      TRD.crystalReportViewer2.ReportSource = treport1; 
      ParameterFieldDefinitions Parameters; 
      ParameterFieldDefinition Parameter; 
      ParameterValues Values = new ParameterValues(); 
      ParameterDiscreteValue DiscreteValue = new ParameterDiscreteValue(); 

      DiscreteValue.Value = dateTimePicker1.Text; 
      Parameters = treport1.DataDefinition.ParameterFields; 
      Parameter = Parameters["fromdate"]; 
      Values = Parameter.CurrentValues; 
      Values.Clear(); 
      Values.Add(DiscreteValue); 
      Parameter.ApplyCurrentValues(Values); 
      DiscreteValue.Value = dateTimePicker2.Text; 
      Parameters = treport1.DataDefinition.ParameterFields; 
      Parameter = Parameters["todate"]; 
      Values = Parameter.CurrentValues; 
      Values.Add(DiscreteValue); 
      Parameter.ApplyCurrentValues(Values); 

     } 
     } 
     catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), "Message"); }; 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     TRD.ShowDialog(); 
    } 

有兩個問題,第一,從一個不同的線程,我得到的答案全部更新進度條,經過後臺工作的另一個電話形式的實例是造成問題,只需將變量放在後臺工作者啓動異步並修復之前。

+0

錯誤真的說明了一切。看看這裏:[鏈接](http://stackoverflow.com/questions/7609839/accessing-a-forms-control-from-a-separate-thread) – parvee

回答

1

錯誤消息告訴您更新控件的唯一方法是通過控件運行的線程。您目前正在使用不同的線程(後臺工作人員)。

查看此鏈接中關於SO Invoke(Delegate)上的其他問題的示例。你基本上應該有一個你可以調用的方法來更新UI,它可以檢查它是否在正確的線程上,以及它是否得到正確的線程來調用它。

這是上面給出的鏈接parvee上的一段代碼,顯示瞭如何執行此操作。

public void UpdateProgress(int percentComplete) 
{ 
    if (!InvokeRequired) 
    { 
     ProgressBar.Value = percentComplete; 
    } 
    else 
    { 
     Invoke(new Action<int>(UpdateProgress), percentComplete); 
    } 
} 
+0

和我將如何使用它?抱歉新的交叉線程。 – Patrick

+0

我仍然收到相同的錯誤,但現在進度條正在更新。我相信我正在從後臺工作人員訪問另一個表單實例,這也許是原因。 – Patrick

+0

它是backgroundWorker1.ReportProgress(5);引發錯誤的行?該功能中的哪些對象是表單上的控件? –