c#从另一个类更新progressbar

本文关键字:更新 progressbar 另一个 | 更新日期: 2023-09-27 18:06:47

首先我要说,嗨,我是新来的c#;)

我正在编写程序,在excel和SQLite文件之间传输翻译。这需要一段时间,所以我试图使用进度条,这是由后台工作者(在backgorundworker1_DoWork)从转移类(Imp/Exp)更新。我试图使用这个答案报告进度背景工作者从不同的类c#,但酒吧更新仅在启动和转移后完成。形式似乎有效,我可以移动它们等等;我已经尝试了第二个解决方案,与事件,但它工作相同;

有一个代码可能很重要

表单类:

public partial class Form2 : Form
{
    private int process = 0;
    private ImpExp prgr;
    private bool _overwrite;
    public Form1 form1;
    public bool overwrite
    {
        get
        {
            return _overwrite;
        }
         private set
        {
            _overwrite = value;
            prgr.overwrite = _overwrite;
        }
    }
    public Form2(Form1 firstForm)
    {
        prgr = new ImpExp(firstForm.excPath, firstForm.excelCol, firstForm.dbPath, firstForm.otherLanguage, this);
        this.form1 = firstForm;
        InitializeComponent();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = false;
        this.Closing += new System.ComponentModel.CancelEventHandler(this.Form2_Closing);
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    }
    public void addColumn()
    {
        prgr.DB.addColumn();
    }
    private void importButton_Click(object sender, EventArgs e)
    {
            process = 1;
            if (!backgroundWorker1.IsBusy)
                backgroundWorker1.RunWorkerAsync();
    }
    private void exportButton_Click(object sender, EventArgs e)
    {
        if (!backgroundWorker1.IsBusy)
            backgroundWorker1.RunWorkerAsync();
        process = 2;
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        YesRadioButton.Checked = true;
        AddLanguageForm addLanguageForm = new AddLanguageForm(this);
        if (!prgr.isReady)
        {
            Close();
        }
        else if (!prgr.DB.langGood)
            {
                addLanguageForm.ShowDialog();
                if (!addLanguageForm.yes)
                {
                    Close();
                }
            }
        Console.WriteLine("Form2 Opened");
        overwrite = YesRadioButton.Checked;
    }
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label1.Text=(e.ProgressPercentage.ToString() + "%");
        Console.WriteLine("ProgressChanged " + e.ProgressPercentage);
    }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        if (process == 1)   //import
        {
            base.Invoke((Action)delegate
            {
                cancelButton.Visible = false;
            });
            prgr.Import(sender as BackgroundWorker);
            process = 0;
            base.Invoke((Action)delegate
            {
                this.cancelButton.Text = "OK";
                cancelButton.Visible = true;
            });

        }
        else if (process == 2)  //export
        {
            base.Invoke((Action)delegate
            {
                cancelButton.Visible = false;
            });
            prgr.Export(sender as BackgroundWorker);
            process = 0;
            base.Invoke((Action)delegate
            {
                this.cancelButton.Text = "OK";
                cancelButton.Visible = true;
            });
        }
    }

    private void YesRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        if (YesRadioButton.Checked == true)
        {
            NoRadioButton.Checked = false;
        }
        overwrite = YesRadioButton.Checked;
    }
    private void NoRadioButton_CheckedChanged(object sender, EventArgs e)
    {
        if (NoRadioButton.Checked == true)
        {
            YesRadioButton.Checked = false;
        }
        overwrite = YesRadioButton.Checked;
    }

}

Imp/Exp类,我试图从中实现progressbar:

class ImpExp
{
    internal MyExcel excel;
    internal MySQLite DB;
    private Form2 form2;
    int firstRow, lastRow;
    internal bool overwrite;
    public bool isReady
    {
        get
            {
                if (excel.isReady && DB.isReady)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        set
            {
            }
    }
    public ImpExp(string excelPath, int excelCol, string dBPath, string dBCol, Form2 dad)
    {
        form2 = dad;
        excel = new MyExcel(excelPath, excelCol);
        DB = new MySQLite(dBPath,dBCol);
        firstRow = 6;
        lastRow=excel.lastRow;

    }
    public void Finish()
    {
        excel.close();
        DB.close();
    }
    public void Export(BackgroundWorker bw)
    {
        bw.WorkerSupportsCancellation = true;
        bw.WorkerReportsProgress = true;
        ExcelRow row = new ExcelRow();
        for (int i = firstRow; i <= excel.lastRow; i++)
        {
            excel.rowNumber = i;
            row = excel.actualRow();
            if (row.pl != null || row.other != null)
            DB.actualizeDB(row);
            Console.WriteLine(row.pl);
            Console.WriteLine(row.other);
            bw.ReportProgress(i/lastRow*100);
        }
        MessageBox.Show("Export finished");
    }
    public void Import(BackgroundWorker bw)
    {
        bw.WorkerSupportsCancellation = true;
        bw.WorkerReportsProgress = true;
        ExcelRow row = new ExcelRow();
        for (int i = firstRow; i <= excel.lastRow; i++)
        {
            string translationTemp;
            excel.rowNumber = i;
            row = excel.actualRow();
            if (overwrite)
            {
                if (row.pl != null)   //pl for Polish
                {
                    translationTemp=DB.translate(row.pl);
                    if (translationTemp != "TRANSLATION NOT FOUND!@#$%")       
                    {
                        string translationTemp2 = translationTemp.Replace(" ","");
                        if(translationTemp2 !="")       //Nie nadpisuj excela pustymi wpisami i spacjami
                        {
                            excel.saveTranslation(translationTemp, i);
                        }
                    }
                }
            }
            else
            {
                if (row.pl != null && (row.other == null || row.other == ""))
                {
                    translationTemp = DB.translate(row.pl);
                    if (translationTemp != "TRANSLATION NOT FOUND!@#$%")
                    {
                        excel.saveTranslation(translationTemp, i);
                    }
                }
            }
            bw.ReportProgress(i / lastRow * 100);

        }
        MessageBox.Show("Import finished");
    }

}

c#从另一个类更新progressbar

如果您想更改Wfa中任何控件的属性。你必须使用某种synchonizationContext。简单的是。

    private void Change<T>(T obj, Action<T> action)
        where T : Control
    {
        if (obj.InvokeRequired)
        {
            obj.Invoke(
                new MethodInvoker(() => Change(obj, action)),
                new object[] { null });
        }
        else
        {
            action(obj);
        }
    }

当您需要更改控件中的某些内容时,例如label1。你必须这样做

Change(label1, l => l.Text = a);

第一个参数是你的控件,第二个参数是用你的控件做什么。需要更多关于invokeric的信息https://msdn.microsoft.com/en-us/library/ms171728 (v = vs.85) . aspx