我有两种形式,通过Form1中的buttonClick调用/创建subForm。现在我可以启动subForm,隐藏Form1,然后在关闭subForm时取消隐藏Form1。我希望能做的是:
我可以找到满足要求的部分解决方案(也许全部,我只是太老了,不知道)。要重复我之前的问题,我到目前为止的代码是:
Form1中
private void countClick(object sender, EventArgs e)
{
this.Hide();
subForm myNewForm = new subForm();
myNewForm.ShowDialog();
this.Show();
countSelect.Checked = false;
}
和subForm
private void totalClick(object sender, EventArgs e)
{
this.Close();
}
这很有效,但它不是很优雅。
答案 0 :(得分:2)
我认为最好的办法就是推出自己的ApplicationContext
。这使您可以完全控制应用程序的生命周期,而无需将其绑定到特定的窗口。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms157901.aspx。
以下是一个例子:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyApplicationContext());
}
}
public class MyApplicationContext : ApplicationContext
{
public MyApplicationContext()
{
ShowForm1();
}
public void ShowForm1()
{
if (_form2 != null)
_form2.Hide();
if (_form1 == null)
{
_form1 = new Form1(this);
_form1.FormClosed += OnFormClosed;
}
_form1.Show();
MainForm = _form1;
}
public void ShowForm2()
{
if (_form1 != null)
_form1.Hide();
if (_form2 == null)
{
_form2 = new Form2(this);
_form2.FormClosed += OnFormClosed;
}
_form2.Show();
MainForm = _form2;
}
private void OnFormClosed(object sender, FormClosedEventArgs e)
{
if (_form1 != null)
{
_form1.Dispose();
_form1 = null;
}
if (_form2 != null)
{
_form2.Dispose();
_form2 = null;
}
ExitThread();
}
private Form1 _form1;
private Form2 _form2;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Form1(MyApplicationContext context)
: this()
{
_context = context;
}
private void button1_Click(object sender, EventArgs e)
{
if (_context != null)
_context.ShowForm2();
}
private readonly MyApplicationContext _context;
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public Form2(MyApplicationContext context)
: this()
{
_context = context;
}
private void button1_Click(object sender, EventArgs e)
{
if (_context != null)
_context.ShowForm1();
}
private readonly MyApplicationContext _context;
}
答案 1 :(得分:2)
因此,我们将首先转到子表单并创建一个新事件,该事件可用于在想要更改表单时通知父项:
public event Action ChangeForm;
然后我们触发事件并在想要更改表单时隐藏子表单:
private void ChangeForm_Click(object sender, EventArgs e)
{
Hide();
if (ChangeForm != null)
ChangeForm();
}
父表单需要子表单的实例作为实例字段:
private subForm child = new subForm();
它需要在它的构造函数中初始化它,既可以向ChangeForm事件添加处理程序以显示父项,也可以向已关闭的事件添加处理程序以自行关闭:
public Form1()
{
InitializeComponent();
child.ChangeForm += () => Show();
child.FormClosed += (s, args) => Close();
}
然后剩下的就是父表单隐藏自己并显示孩子何时想要更改表单:
private void ChangeForm_Click(object sender, EventArgs e)
{
Hide();
child.Show();
}
答案 2 :(得分:0)
为什么不简单地将它们设置为前景,最上面等等? 然后将它们设置为反之亦然?
---添加为建议的评论
答案 3 :(得分:-1)
从MainForm
访问subForm
:
在subForm
和字段中创建构造函数:
MainForm MainFormRef_Field;
subForm(MainForm MainFormRef)
{
this.MainFormRef_Field = MainFormRef;
}
现在,您可以使用此引用访问MainForm
。像这样:
MainFormRef_Field.Show();
MainFormRef_Field.Hide(); //or how ever you want to handle it
从subForm
访问MainForm
:
要处理您的subForm
,请使用您为其创建的对象。这里:
subForm myNewForm = new subForm();
如果任何表单关闭,则关闭整个应用程序:
为两种表单设置Form_Closing
事件:
private void MainForm_Closing(object sender, EventArgs e)
{
Application.Exit();
}
private void subForm_Closing(object sender, EventArgs e)
{
Application.Exit();
}
注意:强>
我不会为您的所有案例编写完整的代码。设置变量,检查条件。一切都取决于你如何编码。您需要的所有要点我已经为您提供了解决方案。