打开其他窗体的Windows表单

4

我想要的
我正在创建一个具有两个功能的应用程序,每个功能都有自己的表单(称为FactuurForm和VerhuurForm)。我还有另一个表单称为Home,其中包括两个按钮。根据点击哪个按钮,我希望打开其中一个表单,并完全关闭Home表单。

我所拥有的
目前,我有以下代码:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Home home = new Home();
        home.ShowDialog();
        if (home.kiesFactuur)
        {
            FactuurForm factuur = new FactuurForm();
            home.Close();
            factuur.ShowDialog();
        }
        else if (home.kiesVerhuur)
        {
            VerhuurForm verhuur = new VerhuurForm();
            home.Close();
            verhuur.ShowDialog();
        }
    }
}

kiesFactuur和kiesVerhuur是布尔值,在我的Home类中初始化为false。一旦我点击其中一个按钮,相应的布尔值将翻转为true,触发if语句关闭home-form并打开新表单。

我的问题
尽管我的当前代码可以工作,但对于这样一个简单的功能来说,似乎有点过于复杂。我觉得我不需要布尔值,这个操作可以更加简单地完成。那么有没有更简单/更好的方法来实现这个操作呢?
我也考虑过创建多个Main函数。单击一个按钮将激活相应的新Main函数并终止当前Main。这种方法可行吗,如果可行,是否是一个好的解决方案?


你应该执行 home.Hide();home.Show(); - Andrew Grinder
为什么不把代码放在第一个表单的按钮处理程序事件中? - Brian
我可以补充的一点是,因为你正在使用.ShowDialog();..所以你应该在home上调用dispose。当使用.ShowDialog();时,.close不会处理窗体对象。你必须调用.dispose。除此之外,我会像你现在这样做... - Louis van Tonder
很好的、清晰的问题 :-) - JohnSaps
3个回答

3

我不太明白为什么需要完全关闭主窗体。我只会为每个按钮放置2个事件处理程序,并在它们上调用以下代码。当您关闭子窗体时,第一个窗体将被隐藏和关闭。

    private void ShowSubDialog(Form form)
    {
        this.Hide();   //makes your main form invisible before showing the subform
        form.ShowDialog();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ShowSubDialog(new FactuurForm());
        Dispose();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        ShowSubDialog(new VerhuurForm());
        Dispose();
    }

非常完美,谢谢。但是把主页窗体一直保持在后台运行不是浪费资源吗?这就是为什么我想要彻底关闭它的原因。或者一个窗体的使用是微不足道的吗? - JeroenM
1
这取决于情境——如果你的主页表单真的只包含两个按钮,而没有其他东西,那么我不会太在意资源的消耗——相比易于理解的结构来说,这更让你的代码易于理解。 - Marwie

1
    private void Factuur_Click(object sender, EventArgs e) {
        LoadForm(new FactuurForm());
    }
    private void Verhuur_Click(object sender, EventArgs e) {
        LoadForm(new VerhuurForm());
    }
    private void LoadForm(Form f) {
        this.Hide();
        f.ShowDialog();
        this.Show();
    }

将以下内容添加到您的主页表单中,从主函数中删除home.ShowDialog()之后的所有内容,并使Facturr_Click和Verhurr_Click处理其各自按钮的单击事件。这将允许主页自动隐藏/显示。

0
你应该像这样替换你的代码:
if (home.kiesFactuur)
{
    FactuurForm factuur = new FactuurForm();
    factuur.Show();
    this.Hide();
}
else if (home.kiesVerhuur)
{
    VerhuurForm verhuur = new VerhuurForm();
    verhuur .Show();
    this.Hide();
}

VerhuurFormFactuurForm中,您可以像这样覆盖关闭事件:
public VerhuurForm()
{
    InitializeComponent();
    this.FormClosed += new FormClosedEventHandler(VerhuurForm_FormClosed);
}

void FormClosedEventHandler(object sender, FormClosedEventArgs e)
{
    Application.Exit();
}

确保在关闭表单时,应用程序也已关闭,因为“主页”仍然是活动的但隐藏的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接