在我的程序中 [C# + winforms]。我有进度条和 ListView 。
通过一种方法,我正在执行一些操作,然后在 Listview 中更新数据。添加的记录数是我为 ProgressBar.value 属性设置的值。我想要的是,根据进度条的值,它应该显示其进度。但是进度条没有更新。只有在方法执行进度条结束时才显示整个进度,即 100%
有人可以在这方面帮助我吗?
谢谢,
阿米特
最佳答案
听起来您正在阻塞 UI 线程 - 即您还没有释放系统来进行任何绘制。
一个hacky的答案是注入(inject)Application.DoEvents()
进入您的代码 - 但这有风险,并且存在重入等问题;它只是有点hacky。
更好的选择可能是在 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/