想实现这样个进度条:主程序中执行一个任务时,弹出进度条窗体。注意,弹出窗口必须是模态对话框(ShowDialog)
主程序代码如下:
namespace ProcessBar
{
    public partial class Form1 : Form
    {        private delegate void ShowProcessBarFrm(int max, int value);
        private frmProcessBar myProgbar;
        public Form1()
        {
            InitializeComponent();
            myProgbar = new frmProcessBar();
        }        private void button1_Click(object sender, EventArgs e)
        {            Thread thread = new Thread(new ThreadStart(UpdateProgressBar));
            thread.Start();            if (myProgbar != null)
            {
                lock (myProgbar.ProgressBar)
                {
                    myProgbar.ShowDialog();
                }
            }
        }        private void UpdateProgressBar()
        {
            ShowProcessBarFrm p = new ShowProcessBarFrm(myProgbar.SetProgess);
            int initialValue = 100;
            for (int count = 0; count < initialValue; count = count + 2)
            {
                //myProgbar.SetProgess(initialValue, count);
                p.Invoke(initialValue, count);
            }
        }
    }
}进度条窗体代码:
public void SetProgess(int max, int value)
        {
            if (value <= max)
            {
                if (InvokeRequired)
                {
                    progressBar1.Maximum = max;
                    progressBar1.Value = value;
                    if (value == max)
                    {
                        progressBar1.Visible = false;
                    }
                    else
                    {
                        progressBar1.Visible = true;
                    }
                }
            }        }程序运行出现问题:"System.InvalidOperationException: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。 恳求,各位大侠指点。如何解决。之前使用弹出非模态窗体(Show)时已经实现,要求该为模态框就有问题了。
大家有什么好的方法请多提宝贵意见。也阅读过来一些多线程实现的方法如:http://www.cnblogs.com/tannaiyin/archive/2009/04/26/1444164.html

解决方案 »

  1.   

    private void Form1_Load(object sender, EventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;//设置任何线程都可访问
            }
      

  2.   

    delegate void UpdateProcessBarValueEventHandle(ProgressBar progressBar,int value);
    void UpdateProcessBarValue(ProgressBar progressBar,int value)
    {
    if(progressBar.InvokeRequired)
    {
    UpdateProcessBarValueEventHandle d=new UpdateProcessBarValueEventHandle(UpdateProcessBarValue);
    this.InVoke(d,new object{progressBar,value});
    }
    }
      

  3.   

    谢谢,你的回复!那样问题是能解决。
    但在我的实际项目中,用线程会些问题。
    刚才,想到了一种解决办法:在进度条窗体中使用Timer控件的timer1_Tick事件并声明委托事件,在主窗体中,注册委托事件 并 启动 timer1有效。
      

  4.   

    if (InvokeRequired)
    {
    this.Invoke((EventHandler)delegate{
    progressBar1.Maximum = max;
    progressBar1.Value = value;
    });
    }
      

  5.   

    问题已经搞定了。使用了 Timer控件和 委托事件 解决了问题。
    多谢各位的关注和解答。