在我的程序中 [C# + winforms]。我有进度条和 ListView 。
通过一种方法,我正在执行一些操作,然后更新 Listview 中的数据。添加的记录数是我为 ProgressBar.value 属性设置的值。我在这里想要的是,根据进度条的值,它应该显示它的进度。但是进度条没有得到更新。仅在方法执行进度条结束时显示整个进度,即 100%
有人可以在这方面帮助我吗?
谢谢, 阿米特
最佳答案
听起来您正在阻塞 UI 线程 - 即您还没有释放系统来进行任何绘画。
一个 hacky 的答案是将 Application.DoEvents()
注入(inject)到您的代码中 - 但这是有风险的,并且存在重入等问题;它只是有点老套。
更好的选择可能是在 BackgroundWorker
上进行处理,定期切换到 UI 线程以更新内容 (Control.Invoke) - 但如果您要添加大量项目,这可能会很棘手到 ListView
。
完整示例(尽管您可能希望批量更新 UI - 而不是一次一行):
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
class MyForm : Form
{
BackgroundWorker worker;
ListView list;
Button btn;
ProgressBar bar;
public MyForm()
{
Text = "Loader";
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.ProgressChanged += worker_ProgressChanged;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
list = new ListView();
list.Dock = DockStyle.Fill;
Controls.Add(list);
btn = new Button();
btn.Text = "Load";
btn.Dock = DockStyle.Bottom;
Controls.Add(btn);
btn.Click += btn_Click;
bar = new ProgressBar();
bar.Dock = DockStyle.Top;
Controls.Add(bar);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
btn.Enabled = true;
}
void btn_Click(object sender, EventArgs e)
{
worker.RunWorkerAsync();
btn.Enabled = false;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
string newRow = "Row " + i.ToString();
worker.ReportProgress(i, newRow);
Thread.Sleep(100);
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
list.Items.Add((string)e.UserState);
bar.Value = e.ProgressPercentage;
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MyForm());
}
}
关于c# - Winforms 进度条不更新 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1068720/