我一直试图理解这篇文章http://bensprogrammingwork.blogspot.com/2012/01/progressbar-in-wpf.html
我的Button_Click
事件中包含以下代码:
FileInfo existingFile = new FileInfo("C:\\Users\\cle1394\\Desktop\\Apple Foreign Tax Payment Sample Layout Proposed - Sample Data.xlsx");
ConsoleApplication2.Program.ExcelData data = ConsoleApplication2.Program.GetExcelData(existingFile);
GetExcelData()
方法需要几分钟才能完成,所以我想显示一个进度条,指出预计完成时间。
但是,我不知道如何将上述教程中的方法应用于我的GetExcelData()
代码:
public static ExcelData GetExcelData(FileInfo file)
{
ExcelData data = new ExcelData();
data.Countries = new List<Country>();
using (ExcelPackage xlPackage = new ExcelPackage(file))
{
// get the first worksheet in the workbook
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
List<string> countryNames = new List<string>
{
"Australia"/*,
"China - Beijing",
"China - Shanghai",
"Hong Kong",
"Hungary",
"Ireland",
"Spain",
"United Kingdom"*/
};
List<string> monthNames = new List<string>
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
foreach (string name in countryNames)
{
Country country = new Country();
Console.WriteLine(name);
country.Name = name;
country.Months = new List<Month>();
foreach (string _name in monthNames)
{
country.Months.Add(GetMonthDataRows(_name, GetMonth(_name, GetCountry(name, worksheet), worksheet), worksheet));
}
country.Totals = GetTotals(country);
data.Countries.Add(country);
// this is where I would like to update the progressbar
}
} // the using statement calls Dispose() which closes the package.
return data;
}
我想在上面的foreach循环中更新进度条。有人能告诉我一个如何做到这一点的例子吗?
答案 0 :(得分:1)
我在WPF中做了类似的事情,但我想在List中显示更新消息而不阻塞UI线程see here。您可以使用消息替换此示例中的List。对不起,刚才没有时间写一个简化版本。
答案 1 :(得分:1)
在文章中,您将看到一个BackgroundWorker
对象。首先,阅读MSDN上的BackgroundWorker Class。
此对象提供了一种在单独的线程中执行长时间运行操作的简便方法。如果您不希望UI在执行操作时锁定,则必须在与UI线程分离的线程上执行长时间运行的操作。您是否使用控制台应用程序无关紧要。
在本文中,您还会看到ProgressChangedEventHandler
被设置为构造函数中名为bw_ProgressChanged
的方法。这个bw_ProgressChanged
方法将在UI线程上调用,因此您可以在此处访问您的UI元素,即ProgressBar
对象。
现在查看bw_DoWork
方法......这是你在另一个线程(由BackgroundWorker
创建)上完成工作(长时间运行的操作)的地方。现在,请注意从BackgroundWorkwer
参数创建sender
的行...这是必不可少的,因为您需要使用该对象从其他线程调用bw_ProgressChanged
方法。这是使用ReportProgress
类的BackgroundWorkwer
方法完成的。
作为进度值传递的值取决于您,但必须介于您在ProgressBar
控件中设置的最小值和最大值之间。我们的想法是,您定期传递一个值,该值会在您每次执行某项工作时增加,并以您将ProgressBar.Maximum
设置为的值结束。
因此,上述示例的唯一连接是您在GetExcelData()
方法中添加的DoWork
方法。
答案 2 :(得分:1)
将以下代码复制到教程中的bw_dowork方法,它应该可以工作。
FileInfo existingFile = new FileInfo("C:\\Users\\cle1394\\Desktop\\Apple Foreign Tax Payment Sample Layout Proposed - Sample Data.xlsx");
ConsoleApplication2.Program.ExcelData data = ConsoleApplication2.Program.GetExcelData(existingFile);
所以,他们正在做的是onStart_click他们启动后台异步任务,这是你需要在onClick方法中编写你当前正在做的事情。