首页 > 解决方案 > 我想同时更新 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();
    }
}

1

我想用这段代码做什么当您在列表视图中插入 7 个进度条并单击更新按钮同时,您正在移动 Lisview 中的 7 个进度条,直到它们达到 100%。

标签: c#

解决方案


推荐阅读