意思是这样的,Form1上面有一个按钮
button1  
点button1的时候弹出Form2 ,并且让Form1上面button1的Enabled为False
在关闭Form2的时候 设置Form1上button1的Enabled为true我的代码:
Form1
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            Form2 f = new Form2();
            f.Show();
        }
        public void set()
        {
            button1.Enabled = true;
        }Form2
        Thread th;
        Form1 f = new Form1();        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            ThreadStart ts = new ThreadStart(f.set);
            th = new Thread(ts);
        }
不用线程直接f.set()也不行`
我跟踪了一个` Form1里面的那个set()方法是执行了,但是没有改变,Form1窗体Refresh()也不行`
请教大家帮忙解释一下这是为什么,小弟不才,谢谢指点

解决方案 »

  1.   

    form2里定义的form1对象f不是你刚才的那个form1对象,所以f.set肯定无效
    Form1 f = new Form1();你可以将刚才的那个form1对象传给form2
    //form1
    private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                Form2 f = new Form2();
                f.f=this;
                f.Show();
            }
            public void set()
            {
                button1.Enabled = true;
            }
    //form2
            Thread th;
            public Form1 f; //不要new        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                ThreadStart ts = new ThreadStart(f.set);
                th = new Thread(ts);
            }
      

  2.   

    ------------->>
     Thread th;
            public Form1 f; //不要new        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                ThreadStart ts = new ThreadStart(f.set);
                th = new Thread(ts);
            }
    //----------------这样不行
     Thread th;
            public Form1 f; //不要new        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                 f.set();
                //ThreadStart ts = new ThreadStart(f.set);
               // th = new Thread(ts);
            }
    //---------------这样就OK
    为什么加了一个线程就不行了呢?
      

  3.   

    简单一点:
    private void button1_Click(object sender, EventArgs e)
    {
    button1.Enabled = false;
    Form2 f = new Form2();
    f.ShowDialog();
    button1.Enabled = true;
    }
      

  4.   


    错倒是没有报`就是没有效果麻烦帮忙解释一下
    我用线程这个程序是怎么运行的,运行经过是怎么样的(比如1#说的(form2里定义的form1对象f不是你刚才的那个form1对象,所以f.set肯定无效
    )
    )
    我不用线程又是怎么样的
      

  5.   

    想到这个了,因为我弹出窗体的时候是加到了Form1的一个panel里面所以不能用模态的
      

  6.   

    你线程没有start,当然没效果了
     private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                ThreadStart ts = new ThreadStart(f.set);
                th = new Thread(ts);
                th.start();//加这句
            }
      

  7.   

    跨线程操作控件需要invoke或者begininvoke。
     参考1参考2
      

  8.   


    晕 开始报错了 线程间操作无效: 从不是创建控件“button1”的线程访问它验证了4#的话  报这个错就知道怎么解释了 要用委托来操作就可以解决了
      

  9.   

    这样一个设置开个线程没有必要吧,利用委托应该很容易实现的。
    在form1中建立一个设置button1.Enabled = True;的方法,并且另外声明一个委托;
    然后在form2中建立接受这个委托方法的变量,在Form1开启Form2时,传入form1的方法。
    最后Form2_FormClosed时,调用这个方法就可以了!
      

  10.   


    其实你没必要用多线程,多线程用到UI必须Invoke,我加这句是解释你说为什么没效果,这几行代码在vs2005或以上版本肯定会报线程使用ui控件的错误
      

  11.   


    private void button10_Click(object sender, EventArgs e)
    {
        (sender as Button).Enabled = false;
        Form frm = new Form();
        frm.FormClosed += delegate { (sender as Button).Enabled = true; };
        frm.Show();
    }
      

  12.   

    Form1代码:
    为了提高代码使用率小弟在做窗体跳转的时候用了反射,下面是反射代码(放到了一个类里面)
            public  void jump_(string name_,Panel p)
            {
                Assembly myAss = Assembly.GetAssembly(this.GetType());
                string formName = name_;
                Type t = myAss.GetType(myAss.GetName().Name + "." + formName);
                Form myForm = (Form)t.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
                myForm.TopLevel = false;
                p.Controls.Add(myForm);
                myForm.Show();
            }调用代码---->Jump.Instance().jump_("Book.frm_HistoricalWaste", this.Panel2);
    如果我这样弹出来的窗体怎么修改那个button的Enabled 呢?因为上面有f.f=this;如果我这样写的话应该怎么去写了` 很迷惑 起指点
      

  13.   

    foreach(control ct in this.controls)
    {
       ct.Enabled =false;
    }
      

  14.   


        public  void jump_(string name_,Panel p)
            {
                Assembly myAss = Assembly.GetAssembly(this.GetType());
                string formName = name_;
                Type t = myAss.GetType(myAss.GetName().Name + "." + formName);
                Form myForm = (Form)t.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
                myForm.TopLevel = false;
                p.Controls.Add(myForm);
                myForm.Show();
            }请大虾指点 这个方法要怎么修改才能达到那个目的啊  不胜感激