c# - Winforms 进度条不更新 (C#)

原文 标签 c#

在我的程序中 [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/

相关文章:

c# - 在SqlGeometry和DbGeometry之间转换

c# - 截取的屏幕截图仅包含黑色像素

c# - 使用 ASP.NET MVC 作为 Web 服务

c# - Mailkit SMTP - StartTLS 和 TLS 标志

c# - foreach block 缺少结尾的 "}"字符

c# - jQuery 可排序 : How to properly post element id array?

c# - 使用多个相关的可终结对象实现可终结处置模式

c# - 具有相同名称的非泛型和泛型类的不好做法?

c# - System.Runtime.CompilerServices.AsyncTaskMethodBuilder::Start 有大量的自我时间

c# - 项目开发中途从VS2010升级到VS2012有风险吗?