14 c#
在我的程序[C#+ winforms]中.我有进度条和列表视图.
通过一种方法,我正在执行一些操作,然后更新Listview中的数据.添加的记录数是我为ProgressBar.value属性设置的值.我想要的是,根据进度条的值,它应该显示其进度.但是,进度条未更新.仅在方法执行结束时,进度条显示整个进度,即100%
有人可以在这方面帮助我吗?
谢谢,阿米特
Mar*_*ell 27
听起来你正在阻止UI线程 - 即你没有释放系统来做任何绘画.
一个hacky的答案是注入Application.DoEvents()你的代码 - 但这是有风险的,并且有重新入侵等问题; 它只是有点hacky.
一个更好的选择可能是对a进行处理BackgroundWorker,定期切换到UI线程来更新内容(Control.Invoke) - 但是如果要向a添加大量项目,这可能会很棘手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());
}
}
Run Code Online (Sandbox Code Playgroud)