我在设计一个软件的时候,当需要把DataTable中的数据生成Excel文件的时候,因为时间较长,需要一个窗体告诉操作人员,现正在生成Excel文件,并用Progressbar显示进度,由于我以前没大用过这个Progressbar以及多线程,所以就参考了网上的一个模态窗体+多线程显示Progressbar的文章,可是不行。
button1_Click()
{
new System.Threading.Thread(new System.Threading.ThreadStart(ShowForm)).Start();
new System.Threading.Thread(new System.Threading.ThreadStart(SetProgress)).Start(); MakeExcelFile();//+....我的生成Excel的程序
}
可是这样执行的结果是,生成Excel文档后,才显示FormProgressBar窗体。
附:1.
public partial class FormProgressBar : Form
{
public FormProgressBar()
{
InitializeComponent();
}
public delegate void dSetProgress(int total, int current); public void SetProgress(int total, int current)
{
if (this.InvokeRequired)
{
try
{
this.Invoke(new dSetProgress(this.SetProgress), new object[] { total, current });
}
catch { }
}
else
{
this.progressBar1.Maximum = total;
this.progressBar1.Value = current;
}
}
}
附2.
public partial class ProjectBudget : Form
{
public ProjectBudget()
{
InitializeComponent();
}
delegate void dShowForm();
FormProgressBar frm = new FormProgressBar();
void ShowForm()
{
if (this.InvokeRequired)
{
this.Invoke(new dShowForm(this.ShowForm));
}
else
{
frm.ShowDialog(this);
}
}
//控制进度
void SetProgress()
{
for (int i = 1; i <= 100; i++)
{
if (frm.DialogResult == DialogResult.Cancel)
{
//判断取消
break;
}
else
{
//模拟进度
frm.SetProgress(100, i);
//System.Threading.Thread.Sleep(10);
}
}
}我改变了一下
button1_Click()
{
new System.Threading.Thread(new System.Threading.ThreadStart(ShowForm)).Start();
new System.Threading.Thread(new System.Threading.ThreadStart(SetProgress)).Start(); new System.Threading.Thread(new System.Threading.ThreadStart(MakeExcelFile)).Start();
}private void MakeExcelFile()
{
....
}
这样倒是显示进度条窗体了,但是在执行MakeExcelFile方法的时候报错, ProjectTreeNode selectNode = (ProjectTreeNode)StaticClass.ProjectTreeView.SelectedNode;
...
说“线程间操作无效: 从不是创建控件“treeViewProject”的线程访问它。”到底需要怎么办呢?
button1_Click()
{
new System.Threading.Thread(new System.Threading.ThreadStart(ShowForm)).Start();
new System.Threading.Thread(new System.Threading.ThreadStart(SetProgress)).Start(); MakeExcelFile();//+....我的生成Excel的程序
}
可是这样执行的结果是,生成Excel文档后,才显示FormProgressBar窗体。
附:1.
public partial class FormProgressBar : Form
{
public FormProgressBar()
{
InitializeComponent();
}
public delegate void dSetProgress(int total, int current); public void SetProgress(int total, int current)
{
if (this.InvokeRequired)
{
try
{
this.Invoke(new dSetProgress(this.SetProgress), new object[] { total, current });
}
catch { }
}
else
{
this.progressBar1.Maximum = total;
this.progressBar1.Value = current;
}
}
}
附2.
public partial class ProjectBudget : Form
{
public ProjectBudget()
{
InitializeComponent();
}
delegate void dShowForm();
FormProgressBar frm = new FormProgressBar();
void ShowForm()
{
if (this.InvokeRequired)
{
this.Invoke(new dShowForm(this.ShowForm));
}
else
{
frm.ShowDialog(this);
}
}
//控制进度
void SetProgress()
{
for (int i = 1; i <= 100; i++)
{
if (frm.DialogResult == DialogResult.Cancel)
{
//判断取消
break;
}
else
{
//模拟进度
frm.SetProgress(100, i);
//System.Threading.Thread.Sleep(10);
}
}
}我改变了一下
button1_Click()
{
new System.Threading.Thread(new System.Threading.ThreadStart(ShowForm)).Start();
new System.Threading.Thread(new System.Threading.ThreadStart(SetProgress)).Start(); new System.Threading.Thread(new System.Threading.ThreadStart(MakeExcelFile)).Start();
}private void MakeExcelFile()
{
....
}
这样倒是显示进度条窗体了,但是在执行MakeExcelFile方法的时候报错, ProjectTreeNode selectNode = (ProjectTreeNode)StaticClass.ProjectTreeView.SelectedNode;
...
说“线程间操作无效: 从不是创建控件“treeViewProject”的线程访问它。”到底需要怎么办呢?
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ }