【发布时间】:2015-09-17 18:13:26
【问题描述】:
所以我试图从一个 WinForms 项目中更改文本,从另一个类而不是 Form 类。 它应该像这样工作:
但它会这样做:
我过去的做法是将对象作为参数传递给我的其他类,然后我可以从其他类更改文本。我对进度条做同样的事情,它确实在那里工作,所以它与进度条一起工作而不是标签很奇怪。
我用这个方法来改变进度条:
public void IncreaseProgress(int progBarStepSize, String statusMsg, int currentProject=-1) {
if (currentProject != -1) {
lblStatus.Text = String.Format("Status: {0} | project {1} of {2}",statusMsg,currentProject,ProjectCount);
}
else {
lblStatus.Text = String.Format("Status: {0}",statusMsg);
}
pb.Increment(progBarStepSize);
}
这里是我使用该方法的地方:
public void InitialiseFile(List<string> filePaths, int eurojobType)
{
foreach (string sheet in outputSheets) {
switch (sheet) {
case "Summary":
for (int i = 0; i < filePaths.Count; i++) {
var filePath = filePaths[i];
IncreaseProgress(1, "Reading Summary", i);
worksheetIn = excelReader.ReadExcelSummary(filePath);
IncreaseProgress(1, "Writing Summary", i);
excelWriter.WriteExcelSummary(worksheetIn);
}
break;
case "Monthly_Cat1":
for (int i = 0; i < filePaths.Count; i++) {
var filePath = filePaths[i];
IncreaseProgress(1, "Reading Monthly", i);
worksheetIn = excelReader.ReadExcelMonthly(filePath);
IncreaseProgress(1, "Writing Monthly", i);
excelWriter.WriteExcelMonthly(worksheetIn);
}
break;
}
}
IncreaseProgress(1, "Completed!");
}
现在我知道此代码有效,因为进度条会增加。它应该跳入第一个 if 循环,因为 i 被作为参数传递,而不是 -1。
//manager class
private Label lblStatus;
private ProgressBar pb;
public Manager(ProgressBar pb, Label lbl){
this.pb = pb;
lblStatus = lbl;
}
//Form class
Manager mgr = new Manager(progressBar1, lblStatus, projectFilePaths.Count, outputSheets.ToArray(), exportPath);
mgr.InitialiseFile(projectFilePaths, eurjobType);
【问题讨论】:
-
不要在 UI 线程上做阻塞工作。
-
Edward,花点时间回顾一下
Tasks和异步模式;以及IProgress<T>接口 -
@SLaks,你到底是什么意思?整个 mgr.InitialiseFile() 方法应该在一个后台工作者中,这样 UI 就不需要等待方法完成了吗?
-
是的;或者,更好的是,使用
await Task.Run() -
添加了一个 Task.Run 示例。
标签: c# winforms label progress-bar