Winforms进度条不更新(C#)

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)


小智 8

真的很抱歉朋友,

实际上,我正在为ProgressBar.value字段赋值,但没有使用update()方法.我用过那个,我的问题得到了解决.

谢谢大家的回复