Visual Studio 2008 を使用しています。
メイン フォームは、進行状況を報告するためにクラスのイベントをサブスクライブしています。CSVReader クラスの ReportProgress イベントは常に null になり、その理由がわかりません。
メインフォーム:
//Constructor
public CreateSQL()
{
InitializeComponent();
csvReader = new CSVReader();
}
private void btnCreateSQL_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
**csvReader.ReportProgress += new EventHandler<CSVReader.ProgressArgs>(CSVReader_ReportProgress);**
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}
protected void CSVReader_ReportProgress(object sender, CSVReader.ProgressArgs e)
{
// Call the UI backgroundworker
backgroundWorker1.ReportProgress(e.Percentage, e.Message);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dt = csvReader.ReadCSVFile(sFile, _hasHeader);
}
クラスCSVReader:
public class CSVReader : IDisposable
{
// Event handler to bind to for reporting progress
public EventHandler<ProgressArgs> ReportProgress;
// Eventargs to contain information to send to the subscriber
public class ProgressArgs : EventArgs
{
public int Percentage { get; set; }
public string Message { get; set; }
}
}
public CSVReader()
{
}
public DataTable ReadCSVFile(string filename, bool headerRow)
{
using (CSVReader reader = new CSVReader(new FileInfo(filename)))
return reader.CreateDataTable(headerRow);
}
public DataTable CreateDataTable(bool headerRow)
{
// Read the CSV data into rows
List<List<object>> rows = new List<List<object>>();
List<object> readRow = null;
while ((readRow = ReadRow()) != null)
rows.Add(readRow);
// Report progress if somebody is listening (subscribed)
**if (ReportProgress != null)
{
ReportProgress(this, new ProgressArgs { Percentage = 33, Message = "Reading File" });
}**
}
ReportProgress イベントは、null であり、常に null である場合に上記でテストされます。いくつかの変数 33 と文字列を返すテストのためにここに配置しましたが、常に null です。
あらゆるご意見ありがとうございます。