我在Form1
上有一个按钮,默认情况下启动禁用。我有一个ConfigureForm
,在那里我有一个菜单条,有一个选项来启用Form1
中的按钮。
private void Portal2HammerButtonEnable_Click(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.Portal2HammerButton.Enabled = true;
}
但是当我关闭ConfigureForm
并查看按钮时,它仍然被禁用。
这是因为您创建了一个新的Form1并在该表单上启用了按钮。相反,您必须传递实际打开的表单的实例。
出于设计目的,您可能希望在这两个表单之间使用一个控制器类。这将帮助您简化在两个表单之间传递数据或操作的复杂性,并使您能够更好地升级应用程序。
当您打开ConfigureForm
时,您必须执行以下操作(以最简单的形式,但不推荐)
...
{
ConfigureForm frmConfigure = new ConfigureForm(this);
}
然后进入ConfigureForm
:
public partial class ConfigureForm : Form
{
private From1 mainForm = null;
public ConfigureForm()
{
InitializeComponent();
}
public ConfigureForm(Form callingForm):this()
{
mainForm = callingForm as Form1;
}
private void Portal2HammerButtonEnable_Click(object sender, EventArgs e)
{
mainForm.Portal2HammerButton.Enabled = true;
}
}
单击此按钮将创建一个新表单。您需要的是对Form1实际实例的有效引用。
你有一些可用的选项:
- 如果其中一个表单是应用程序的"主"表单,那么你可以确保它首先被创建,从而创建其他"子"表单。你可以重写任何子表单的构造函数,以包含对"主"表单的引用。
- 你可以在一个公共静态类中保留对所有重要表单的引用,这样所有表单都可以访问这些引用
- 您可以添加自己的公共方法来将"父窗体"分配为子窗体的成员或属性。
- 在创建或显示任何子表单时,可以使用反射来查找"主"或"父"表单的实例。如果你这样做,只做一次,而不是每次都做。尝试缓存该信息。
- 你可以阅读
System.Windows.Forms
命名空间,看看是否已经有一个对象的集合,通过它你可以迭代找到你的主要形式。