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");
}
}
如果您想更改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