C# Winform:
一个form上有button1和button2,
button的click事件是:MessageBox.Show("Hello");
button2的click事件里开启一个线程: 
{
      Thread myThread=new Thread(new ThreadStart(Run));
      myThread.Start();
}在private void Run()里面要求实现:
   将button1上文字的字体变为Red,并且执行一次button1的click事件
本人对委托机制不是很了解,而线程中要修改非此线程中的控件到了VS05后都需要用委托来实现了,
所以本人求一段简单的代码,1是了解下然后在线程中修改主线程控件的属性以及操作主线程中控件的事件   
    望给予相关示例代码,如上要求,谢谢!

解决方案 »

  1.   

    呵呵,这是一个经常遇到的问题。请多查询MSDN或者CSDN都行……
    //委托的定义
    private delegate void DelButtonClick();//这是你自己的私有方法
    private void buttonClick()
    {
        if(InvokeRequired)
        {
            DelButtonClick dbc = new dbc(buttonClick);    //异步的委托
            this.Invoke(dbc);
            return;                                       //这里一定要返回
         }
        MessageBox.Show("test");
    }
    //Button1的事件调用
    private void button1_Click(object Sender,EventArg e)
    {
         buttonClick();
    }//Button2的线程调用
    private void Run()
    {
        buttonClick();         //都是直接调用
    }
      

  2.   

    谢谢1楼, 我大概了解了委托的意思:
    首先定义一个委托   然后实例化这个委托 并给这个委托的实例一个调用的方法 然后用响应的Invoke(委托实例,参数)实现代理  
       这是我现在的理解
       那请问这里的Invoke(委托实例,参数)的参数应该怎么设置的?
       比如就拿我上面的例子   要求将button1.ForeColor设置成Red
       这里的参数该然后设置及运用的呢?
      

  3.   


    //带参数的委托定义,为了更通用化,我给带两个参数的例子。带1个或更多参数与此相同。
    private delegate void DelButtonClick(Color f,Color b);//这是你自己的私有方法
    private void buttonClick(Color f,Color b);
    {
        if(InvokeRequired)
        {
            DelButtonClick dbc = new dbc(buttonClick);    //异步的委托
            this.Invoke(dbc,f,b);                    //参数加在后面。如果只有一个参数,你就用this.Invoke(dbc,f);这种形式的。
            return;                                       //这里一定要返回
         }
         button1.ForeColor = f;
         button1.BackColor = b;
    }
    //Button1的事件调用
    private void button1_Click(object Sender,EventArg e)
    {
         buttonClick(Color.Black,Color,Green);
    }//Button2的线程调用
    private void Run()
    {
        buttonClick(Color.Green,Color.Black);         //都是直接调用
    }
      

  4.   

    多谢phy的详细解说。提一点BUG        DelButtonClick dbc = new dbc(buttonClick);    //异步的委托
    好像应该改为  DelButtonClick dbc = new DelButtonClick (buttonClick);    //异步的委托