我在设计一个软件的时候,当需要把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”的线程访问它。”到底需要怎么办呢?

解决方案 »

  1.   

    你可以用DataTable行数作为总数,然后让进度条-1循环就可以了。
      

  2.   

    不是这个问题,我说的是ProgressBar窗体怎么能在生成Excel文件的时候,显示出来。显示ProgressBar的窗体是单独的。
      

  3.   

    有人说用BackgroundWorker 类,怎么用啊?有没有高手啊,期盼!!严重期盼!
      

  4.   

    加个backgroundWorker控件
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
                
                
    }private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {        }