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

标签 c#

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

相关文章:

c# - 我的 C# 应用程序被防病毒应用程序标记。我如何找出原因?

c# - 删除部分字符串的最佳方法是什么? (C#)

c# - 在 WPF 中制作 Gif 动画

c# - '<null>' 类型的值不能用作默认参数,因为没有到 'T' 类型的标准转换

c# - 将 lambda 表达式参数限制为类的属性

c# - 如何在十六进制和十进制之间转换数字

c# - 在 C# 中的循环中捕获变量

c# - StackExchange.Redis:获取 channel 订阅数(即 PUBSUB NUMSUB)

c# - 使用 ViewModel 时保持 Linq to SQL 事件 (ASP.NET MVC)

c# - 如何根据所选数据自定义同步,只有同步框架/技巧才能做到