c# - 我想同时更新 C# 列表视图中的 7 个进度条
问题描述
我将进度条放在列表视图中并实现了每次更新。我想使用后台工作人员同时运行插入到列表视图中的 7 个进度条。帮我怎么做
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
backgroundWorker1.RunWorkerCompleted += new
RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.RunWorkerAsync();
}
我想通过后台worker更新一共7列的程序栏。目的是同时表达文件复制和完成状态
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int N = 7;
ListView listview1 = null;
this.Invoke(new MethodInvoker(delegate { listview1 = listview1; }));
ListViewItem lvi;
ProgressBar pb;
for (int i = 0; i < 100; i++)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
UpdateItemValue(i.ToString(), i);
backgroundWorker1.ReportProgress(i * 100 / listView1.Items.Count, i);
}
e.Result = N;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
listView1.Items[0].SubItems[3].Text = "Done";
}
private void UpdateItemValue(string key, int value)
{
//There is also a cross-thread problem in the UpdateItemValue method[enter image description
//here][1]
ListViewItem lvi;
ProgressBar pb;
lvi = listView1.Items.Cast<ListViewItem>().FirstOrDefault(q => q.SubItems[0].Text == key);
if (lvi != null)
lvi.SubItems[2].Text = value.ToString();
pb = listView1.Controls.OfType<ProgressBar>().FirstOrDefault(q => q.Name == key);
if (pb != null)
pb.Value = value;
}
此方法向列表视图添加一列并添加一个进度条。
private void Additem_Click(object sender, EventArgs e)
{
ListViewItem lvi = new ListViewItem();
if (listView1.Items.Count > 0)
{
listView1.BeginUpdate();
lvi.Text = listView1.Items.Count.ToString();
lvi.SubItems.Add("111");
lvi.SubItems.Add("222");
lvi.SubItems.Add("333");
listView1.Items.Add(lvi);
ProgressBar pb = new ProgressBar();
Rectangle r = lvi.SubItems[2].Bounds;
pb.SetBounds(r.X, r.Y, r.Width, r.Height);
pb.Minimum = 0;
pb.Maximum = 100;
pb.Value = 0;
pb.Name = listView1.Items.Count.ToString(); // use the key as the name
listView1.Controls.Add(pb);
listView1.EndUpdate();
}
}
我想用这段代码做什么当您在列表视图中插入 7 个进度条并单击更新按钮同时,您正在移动 Lisview 中的 7 个进度条,直到它们达到 100%。
解决方案
推荐阅读
- sql-server - 从查询中提取数据到变量
- flutter - Dart 中的嵌套 Map 操作
- amazon-web-services - 亚马逊短信发送状态和收到的短信
- javascript - 切换显示/隐藏元素,其中默认刷新为隐藏
- android - 没有构建器可用于构建“org.jetbrains.plugins.gradle.model.internal.DummyModel”类型的模型
- go - 停止 goroutine 在 bufio.NewScanner 上等待
- socat - 使用 Socat 监听多个端口(端口范围)
- google-analytics - 增强的电子商务错误数据
- java - 如何读取第 12000 个字符后的一行?
- selenium-webdriver - OpenQA.Selenium.WebDriverException: [windowHandle] 不是顶级窗口句柄解决方案