我用了backgroundworker控件 在dowork事件中循环得到一个控件,然后将这个控件加入到窗体中的一个PANEL中,怎么将这控件在循环当中加入到加入到窗体当中呢?

解决方案 »

  1.   

    直接在doworker中操作肯定报错。请问下怎么来处理这种情况。
      

  2.   

    需要在DoWork的事件响应中里调用BeginInvoke方法,示例代码如下:public partial class Form1 : Form
        {
            // 定义delegate以实现添加control
            public delegate void AddControlsHandler();        public Form1()
            {
                InitializeComponent();            m_BackgroundWorker = new BackgroundWorker();
                m_BackgroundWorker.DoWork += new DoWorkEventHandler(m_BackgroundWorker_DoWork);
            }        void m_BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                //调用form的BeginInvoke方法来调用一个delegate帮助实现添加控件
                this.BeginInvoke(new AddControlsHandler(HandleAddControls));
            }        void HandleAddControls()
            {
                this.panel1.Controls.Add(new Button());
            }        private BackgroundWorker m_BackgroundWorker;        // 单击按钮以触发DoWork
            private void button1_Click(object sender, EventArgs e)
            {
                m_BackgroundWorker.RunWorkerAsync();
            }
        }
      

  3.   

    在Background的ReportProgress事件中操作试过没有?
      

  4.   

    worker = new BackgroundWorker(); 
              worker.WorkerReportsProgress = true;            worker.WorkerSupportsCancellation = true; 
                worker.DoWork += new DoWorkEventHandler(bg_DoWork); 
              worker.ProgressChanged += new ProgressChangedEventHandler(bg_ProgressChanged);            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted); 
    private void bg_DoWork(object sender, DoWorkEventArgs e) 
            { 
                foreach (//你的循环) 
                { 
                     control cl = ...// 得到你的控件
                                   ((BackgroundWorker)sender).ReportProgres(count ,cl);     //控件传递到   bg_ProgressChanged事件  
       
                 } 
            }
    void bg_ProgressChanged(object sender, ProgressChangedEventArgs e) 
            { 
                //addcontrol 这里可以操作UI上的控件.        }
      

  5.   

    LZ的初衷是后台线程处理数据,但是,BackGroundWorker组件或利用委托Invoke也罢,关于界面的操作都在显示界面的那个线程中运行的!完全关于界面的操作中,使用多线程没有意义!