【问题标题】:Windows form opening other formsWindows 窗体打开其他窗体
【发布时间】:2014-08-05 22:43:19
【问题描述】:

我想要什么
我正在创建一个具有两个功能的应用程序。这两种功能都有自己的形式(称为 FactuurForm 和 VerhuurForm)。我有另一个名为 Home 的表单,其中有两个按钮。根据单击的按钮,我希望打开两个表单之一,并完成关闭 Home-form。

我有什么
目前,我有以下代码:

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 语句关闭主表单并打开新表单。

我的问题
尽管我当前的代码有效,但对于这样一个简单的功能来说似乎有点多。我觉得我不需要布尔值,这一切都更容易完成。那么有没有更简单/更好的方法来做到这一点?
我还考虑过创建多个 Main 函数。单击一个按钮将激活相应的新 Main 函数并终止当前的 Main。这甚至可能吗?如果可以,这是一个好的解决方案吗?

【问题讨论】:

  • 你应该做home.Hide();home.Show();
  • 为什么不把代码放在第一种形式的按钮处理事件中?
  • 我可以补充一点,因为您使用的是.ShowDialog();.. 您应该在家调用 dispose。使用.ShowDialog(); 时,.close 不会释放表单对象。您必须致电.dispose。除此之外,我会像你那样做......
  • 好而清晰的问题:-)

标签: c# winforms


【解决方案1】:

我不完全理解完全关闭主页表单的必要性。我只需为每个按钮放置 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();
    }

【讨论】:

  • 完美运行,谢谢。但是让 Home 表单一直在后台运行不是浪费资源吗?这就是为什么我想完全关闭它。还是一种形式的使用无关紧要?
  • 这取决于上下文 - 如果你的主窗体真的只包含 2 个按钮,我不会太在意资源 - 与使你的代码更容易理解的更简单的结构相比。
【解决方案2】:
    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 表单中,从 Main 中删除 home.ShowDialog() 之后的所有内容,并使 Facturr_Click 和 Verhurr_Click 处理各自按钮的单击事件。这将允许 Home 自动隐藏/显示。

【讨论】:

    【解决方案3】:

    你应该像这样替换你的代码:

     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();
            }
    

    如果您关闭表单,请确保您的应用程序已关闭,因为 Home 仍处于活动状态但已隐藏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多