意思是这样的,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()也不行`
请教大家帮忙解释一下这是为什么,小弟不才,谢谢指点
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()也不行`
请教大家帮忙解释一下这是为什么,小弟不才,谢谢指点
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);
}
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
为什么加了一个线程就不行了呢?
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
Form2 f = new Form2();
f.ShowDialog();
button1.Enabled = true;
}
错倒是没有报`就是没有效果麻烦帮忙解释一下
我用线程这个程序是怎么运行的,运行经过是怎么样的(比如1#说的(form2里定义的form1对象f不是你刚才的那个form1对象,所以f.set肯定无效
))
我不用线程又是怎么样的
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
ThreadStart ts = new ThreadStart(f.set);
th = new Thread(ts);
th.start();//加这句
}
参考1参考2
晕 开始报错了 线程间操作无效: 从不是创建控件“button1”的线程访问它验证了4#的话 报这个错就知道怎么解释了 要用委托来操作就可以解决了
在form1中建立一个设置button1.Enabled = True;的方法,并且另外声明一个委托;
然后在form2中建立接受这个委托方法的变量,在Form1开启Form2时,传入form1的方法。
最后Form2_FormClosed时,调用这个方法就可以了!
其实你没必要用多线程,多线程用到UI必须Invoke,我加这句是解释你说为什么没效果,这几行代码在vs2005或以上版本肯定会报线程使用ui控件的错误
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();
}
为了提高代码使用率小弟在做窗体跳转的时候用了反射,下面是反射代码(放到了一个类里面)
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;如果我这样写的话应该怎么去写了` 很迷惑 起指点
{
ct.Enabled =false;
}
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();
}请大虾指点 这个方法要怎么修改才能达到那个目的啊 不胜感激