3

我有两个表单,子表单由 Form1 中的 buttonClick 调用/创建。现在我可以启动 subForm,隐藏 Form1,然后在 subForm 关闭时取消隐藏 Form1。我想做的是:

  1. 如果用户单击 changeform 按钮,请检查 subForm 是否处于活动状态但隐藏
  2. 如果否,则启动 subForm,否则隐藏 Form1,取消隐藏 subForm 并将控制权传递给它
  3. 如果用户单击 subForm 的 changeform 按钮,隐藏 subForm,取消隐藏 Form1 并将控制权传递给它
  4. 如果用户单击表单右上角的“X”,则关闭应用程序,无论哪个表单处于活动状态。(现在,选择“X”会关闭子表单并打开/取消隐藏 Form1。)

我可以找到满足部分要求的解决方案(也许全部,我只是太菜鸟不知道)。在这里重复我之前的问题,我到目前为止的代码是:

表格1

    private void countClick(object sender, EventArgs e)
    {
        this.Hide(); 
        subForm myNewForm = new subForm();
        myNewForm.ShowDialog();
        this.Show();
        countSelect.Checked = false;
    }

和子窗体

    private void totalClick(object sender, EventArgs e)
    {
        this.Close();
    }

这行得通,但它不是很优雅。

4

4 回答 4

2

因此,我们将首先转到子表单并创建一个新事件,该事件可用于在父表单想要更改表单时通知它:

public event Action ChangeForm;

然后我们触发事件并在它想要更改表单时隐藏子表单:

private void ChangeForm_Click(object sender, EventArgs e)
{
    Hide();
    if (ChangeForm != null)
        ChangeForm();
}

父表单需要一个子表单的实例作为实例字段:

私有子表单子 = 新子表单();

它需要在它的构造函数中对其进行初始化,将处理程序添加到 ChangeForm 事件以显示父级,并添加到关闭事件以关闭自身:

public Form1()
{
    InitializeComponent();

    child.ChangeForm += () => Show();
    child.FormClosed += (s, args) => Close();
}

然后剩下的就是父表单隐藏自己并在孩子想要更改表单时显示:

private void ChangeForm_Click(object sender, EventArgs e)
{
    Hide();
    child.Show();
}
于 2013-07-02T16:01:38.083 回答
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;
}
于 2013-07-02T15:24:55.590 回答
0

为什么不简单地将它们设置为前景、顶部等?反之亦然?

---按照建议添加为评论

于 2013-07-02T15:39:51.690 回答
-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();
}

笔记:

我不是为您的所有案例编写整个代码。设置变量,检查条件。这完全取决于您如何编码。您需要的所有要点我都为您提供了解决方案。

于 2013-07-02T15:40:12.960 回答