2

アプリがExcelシートからデータを読み取って取得しているときに、プログレスバーの使用に問題があります

これは私がやりたいことです-:

  • 私のアプリケーションは、ブック内のさまざまな Excel シートのセルからデータを読み取ります
  • データが読み取られると、「ファイルが正常に読み取られました」というメッセージ ボックスがユーザーに表示されます。
  • データがファイルから読み取られている間にフォームでプログレスバーを実行する必要があり、メッセージボックスがポップアップする前に一度完了率を表示する必要があります

これは私がしたことです-:

  • バックグラウンド ワーカーとプログレス バーを追加しました
  • これは、Run worker を呼び出すコードのスニペットです。RunWorkerAsync は、ボタンがクリックされ、読み取るファイルが選択されたときに呼び出されます。

    // Start the BackgroundWorker.
            fileReadingbackgroundWorker.RunWorkerAsync();
    
  • 進行状況を報告するスニペット

    int percentProcessFile =1;
    for (int i = 1; i <= countSheets; i++)
    {
        readSheet = (Excel.Worksheet)excelWorkbook.Worksheets.get_Item(i);
    
        for (int row = 2; row <= 100; row++)
        {
            if (readSheet.Cells[1][row].Text.ToString() != "")
            {
                for (int column = 1; column <= 15; column++)
                {
                    String Key = readSheet.Cells[1][row].Text.ToString();
                    String readCaptionCell = readSheet.Cells[column][1].Text.ToString();
                    String readCurrentCell = readSheet.Cells[column][row].Text.ToString();
                    if (readSheet.Name == "ISMB")
                          ISMBSections.Add(Key, readCaptionCell, readCurrentCell);
                    else if (readSheet.Name == "ISMC")
                          ISMCSections.Add(Key, readCaptionCell, readCurrentCell);
                 }                        
           }
           else
           {
               break;
           }
           precentProgressFile++;
           fileReadingbackgroundWorker.ReportProgress(precentProgressFile);
       }   
    }
    

fileReadingbackgroundWorker.ReportProgress(precentProgressFile);は例外をスローします

  • 次の行も追加しました

    private void fileReadingbackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 100; i++)
        {
            // Wait 100 milliseconds.
            Thread.Sleep(100);
            // Report progress.
            fileReadingbackgroundWorker.ReportProgress(j);
    
        }
    }
    
    private void fileReadingbackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        fileReadingProgressBar.Value = e.ProgressPercentage;
    }
    

fileReadingbackgroundWorker.ReportProgress(precentProgressFile);2 番目のスニペットの行は例外をスローします

ここで何がうまくいかないのか理解できません。Visual Studio 12.0 と .Net 4.0 を使用しています。ご不明な点がございましたらお問い合わせください

「 BackgroundWorker スレッドからの UI コントロールへのアクセス - C# の理由は、DispatcherInvoke をどこにも使用していないため」の複製ではありません。

4

1 に答える 1