使用 C#、Windows 窗体创建 .net 应用程序。如何在 100 个循环的每个循环中更新进度条 1 步?
(我正在循环中处理 Excel 工作表。)
进度条控件位于 UI 类中,该类连接到控制器类,该控制器类连接到自定义类
(MVC 模式)。循环位于自定义类中。
我是否需要在每个方法中一路向下发送 UI 类实例,还是有更好的方法?
现在,进度条在循环结束后更新。 Application.doevents 和 .update 或 .refresh 不起作用。
假设下面是您的类负责使用其中的循环进行工作。添加一个事件来表明您的进度。然后从您的 UI 中简单地处理该事件并相应地更新进度条。
sealed class Looper
{
public event EventHandler ProgressUpdated;
private int _progress;
public int Progress
{
get { return _progress; }
private set
{
_progress = value;
OnProgressUpdated();
}
}
public void DoLoop()
{
_progress = 0;
for (int i = 0; i < 100; ++i)
{
Thread.Sleep(100);
Progress = i;
}
}
private void OnProgressUpdated()
{
EventHandler handler = ProgressUpdated;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
你可以通过有一个来实现这个BackgroundWorker
作为用户界面的一部分,在backgroundWorker.DoWork
您拨打的事件looper.DoLoop()
。然后在你的处理程序中looper.ProgressUpdated
您可以致电的事件backgroundWorker.ReportProgress
从 UI 线程增加进度条。
请注意,将进度本身包含在您所携带的信息中可能更有意义。ProgressUpdated
事件(我只是不想写一个源自EventArgs
来说明这一点;无论如何,你可能会明白图片)。
另请注意,除非您在与 UI 线程不同的线程上使用循环执行代码,否则上述内容实际上没有任何意义。否则,无论如何,您的所有工作都会在下一次 UI 刷新之前完成,因此进度条不会提供任何值(当循环完成时,它只会从 0 变为 100)。
只是一个如何实现此类事情的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)