gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:50:37 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com