我可以使用以下代码打开第一个名为“ FieldReprogrammingSoftware ”的表单,并打开另一个名为“Setup”的表单。
Setup fh = new Setup();
fh.Show();
this.Hide();
但是我似乎无法回到 FieldReprogrammingSoftware ,因为该名称甚至不是 Setup 代码中的一个选项。如果我尝试只输入 FieldReprogrammingSoftware ,我会收到错误消息:
名称'FieldReprogrammingSoftware' 在当前上下文中不存在
任何想法?
请记住,我是C#的菜鸟。
NVM,我刚刚发现,对于这个产品, FieldReprogrammingSoftware 表单可以保持打开状态,而 Setup 表单已经打开,所以我现在只是使用
Setup fh = new Setup();
fh.Show();
FieldReprogrammingSoftware 表单上的和
this.close()
在设置表单上。上帝在VB中很容易做到
两种形式的命名空间都是FieldUpdate,这就是我的解决方案。
答案 0 :(得分:4)
您必须将主窗体的实例传递给Setup
或创建一个静态变量来保存主窗体。
您还可以订阅Setup
表单已关闭事件,然后再次显示该表单。
喜欢这样
Setup setupForm = new Setup();
setupForm.Show();
setupForm.FormClosed += (o,e) => this.Show();
this.Hide();
编辑.NET 2.0
Setup setupForm = new Setup();
setupForm.Show();
setupForm.FormClosed += new FormClosedEventHandler(setupForm_Closed);
this.Hide();
void setupForm_Closed(object sender, FormClosedEventArgs e)
{
this.Show();
}
答案 1 :(得分:4)
在“设置”表单中,您可以使用:
private void button1_Click(object sender, EventArgs e)
{
Application.OpenForms[0].Show();
this.Hide(); // or this.Close();
}
这将再次显示第一个表格。 “0”是应用程序主窗体的索引。
答案 2 :(得分:4)
在您所描述的情况中,您希望恢复原始实例。您已使用this.hide
隐藏表单。
显然你不想新建另一个实例,因为这会浪费资源;您需要做的是将初始实例存储在您可以从子表单获取的位置。
有几种方法可以做到这一点,但我很可能采用以下两种方法之一:
<强>的Singleton:强>
将您的主表单存储在单例中,这样当您需要将其恢复时,您可以参考存储的实例,而不是浪费地新建另一个实例。
public static class GlobalForms
{
private MainForm _main;
public MainForm Main
{
get
{
if (_main == null) _main = new MainForm();
return _mainForm;
}
}
}
现在,当你需要MainForm时,你可以引用单例,而不是新建它。
Form mainInstance = GlobalForms.Main
mainInstance.Show();
//Do any other stuff for your main form.
this.Hide(); //Or this.Close();
这是延迟加载的,所以在第一次需要它之前它不会创建主窗体的实例。在此之后它将被保留,直到你再次需要它,除非你处理它,在这种情况下循环将再次开始。
打开第二个表单作为第一个表单的孩子:
Form otherForm = new OtherForm();
otherForm.Show(this); //This sets up the main form as the owner of this one for this call
this.Hide();
或者,如果您希望将OtherForm作为模态对话框打开(即,当此窗口打开时您无法与其他窗口交互),请执行otherForm.ShowDialog(this);
来自OtherForm:
this.Owner.Show();
this.Close();
或者,Stan R已经讨论了a neat idea using an event handler to catch the close event of the child form。虽然如果您有多个表单打开您的子表单,这可能会变得复杂,因此如果此表单是许多表单的通用对话框,则应谨慎使用此方法。
您还可以访问Application.OpenForms集合以获取当前在应用程序中打开的表单。您需要知道您希望激活的表单的索引。
每种方法都有其缺点。当然,您采用的路线将补充您的其他架构和设计实践,以便您的代码保持一致。
答案 3 :(得分:1)
如果您只需要暂时使用“设置”表单,则另一种方法是将表单作为对话框打开。
using(Setup fh = new Setup())
{
this.Hide();
fh.ShowDialog();
this.Show();
}
答案 4 :(得分:0)
跟随你的心,让错误信息成为你的指南。
检查FieldProgrammingSoftware表单的命名空间,它位于代码文件的顶部,位于using语句的下方。有时,特别是在复制代码或从其他项目添加新表单时,很容易混合名称空间。
例如,如果您创建一个名为 WindowsApplication1 的新项目,则添加到项目中的所有新表单将自动继承该命名空间,并将 WindowsApplication1 作为其命名空间。如果您将另一个项目中的表单添加到现有项目中,它将使名称空间与其他项目保持一致。
如果您没有故意在代码中添加新的命名空间,这听起来不像您正在做的那样,请确保两者都匹配(或者两者都至少具有命名空间)。否则,要么添加新命名空间,要么单击未获得智能感知的对象的末尾,然后按 Ctrl。以查看VS是否可以为您找到对象命名空间。