2012-10-19 48 views
1

自从我使用Windows Forms应用程序以来已经有一段时间了。我在主窗体上有一个复选框,并且根据一定的条件,如果需要打开第二个窗体来向用户请求额外的数据,我应该如何从第二个窗体向主窗体传递(或取回)消息窗体,所以我可以判断是否可以选中或取消选中复选框?处理表单之间传递Control.Checked状态的最佳方法

从我记事起,我可以ref使用像通行证。还是有更好的方法来完成这个?

+1

我不确定我是否理解你的情况,但我不认为通过ref是在这里的解决方案。首先打开什么样的表单?一种是另一种的父母吗?你想什么时候通过这个价值? – Otiel

+1

你检查了[那些](http://stackoverflow.com/search?q= [c%23] + pass + data +之间的+表单)? – Otiel

+0

你可能想看看Form.ShowDialog方法(在这里看到的例子:http://msdn.microsoft.com/en-us/library/c7ykbedk%28v=vs.100%29.aspx) – RobH

回答

1

这样做的一种方法是使用事件。

在你的孩子的形式,宣布一个事件,在特定的用户交互得到提升,并简单地“订阅”此事件在您的主要形式。

当你实例,并打电话给你的孩子的形式,你会做这样的:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 frm = new Form2(); 
    frm.MyEvent += frm_MyEvent; 
    frm.ShowDialog(); 
    frm.MyEvent -= frm_MyEvent; 
} 

private void frm_MyEvent(object sender, EventArgs e) 
{ 
    textBox1.Text = "whatever"; //just for demo purposes 
} 

在你的孩子的形式,声明该事件并提高它:

public event EventHandler MyEvent; 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (MyEvent!= null) 
     MyEvent(this, EventArgs.Empty); 
} 

希望这有助于

+0

有趣的方法。谢谢! – Arrow

+1

@James:请注意,在我的示例中,我使用了EventArgs.Empty,但是您可以使用带有值的“真实”EventArg传递回主表单。 –

+0

做这一切会有什么意义?事件的要点是允许某些代码在将来(从订阅者的角度来看)的某个不确定点执行,但订阅者知道它何时需要执行代码。这实质上就是你使用*非*模态对话框时需要遵循的模型,但是对于模态对话框来说,这只是不必要的工作。 – Servy

3

因为你是显示子窗体作为一个对话框,并且父窗体并不需要它,直到形式关闭,所有你需要做的就是添加一个属性与公共getter和setter方法私有的子窗体,在适当时在子窗体中设置值,然后在调用ShowDialog之后从主窗体读取值。

+0

非常感谢@Servy。 – Arrow

相关问题