简体   繁体   English

GUI /进度条未从backgroundworker更新

[英]GUI/progress bar not updating from backgroundworker

I've been trying to get this work, but it just won't update anything on the GUI and my app exists on the error i showed in the code. 我一直在努力完成这项工作,但是它不会在GUI上进行任何更新,并且我的应用程序存在代码中显示的错误。

    ListViewItem item;

    public void SetStatusStrip()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;

        listviewTables.Columns.Add(gDatabase);

        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            try
            {
                MySqlCommand iCommand = new MySqlCommand("SHOW TABLES;", iCon);
                iRead = iCommand.ExecuteReader();
                int i = 0;
                while (iRead.Read())
                {
                    item = new ListViewItem(new[] { iRead.GetString(0) });
                    bw.ReportProgress(i);
                    i++;
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show("There was an error getting tables from the database: " + gDatabase + ".\n\nError Dump:\n" + ex, "MySQL Error!");
                return;
            }
        });

        bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate(object o, ProgressChangedEventArgs args)
        {
            progressBar1.Value = args.ProgressPercentage;
            listviewTables.Items.Add(item); // I get error here: System.ArgumentException
        });

        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        delegate(object o, RunWorkerCompletedEventArgs args)
        {
            progressBar1.Value = 0;

            // Finished.
        });

        bw.RunWorkerAsync();
    }

I agree with LarsTech. 我同意LarsTech。

Pass out the ListViewItem in ReportProgress(); 在ReportProgress()中传递ListViewItem;

            while (iRead.Read())
            {
                bw.ReportProgress(i, new ListViewItem(new[] { iRead.GetString(0) }));
                i++;
            }

Then cast UserState in ProgressChanged() back to a ListViewItem: 然后将ProgressChanged()中的UserState回ListViewItem:

    bw.ProgressChanged += new ProgressChangedEventHandler(
    delegate(object o, ProgressChangedEventArgs args)
    {
        progressBar1.Value = args.ProgressPercentage;
        listviewTables.Items.Add((ListViewItem)args.UserState);
    });

Note that I am NOT using your global var of "item", which is a bad idea to begin with. 请注意,我没有使用全局变量“ item”,这是一个不好的主意。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM