【问题标题】:Navigating between multiple forms in C#在 C# 中的多个表单之间导航
【发布时间】:2011-08-10 16:02:47
【问题描述】:

我有 2 个表单,其中一个添加了冲击波组件,它播放 Flash 电影,单击 Flash 中创建的按钮时,表单 1 (frmFlashIntro) 会卸载,表单 2(frmMain) 会启动。 因为 frmFlashIntro 是一种仅在我想卸载而不是隐藏它时使用的表单。一旦 frmFlashIntro 像主窗体一样关闭,我也希望 frmMain 能够完全控制。 隐藏表单似乎不是做这件事的好方法。

我目前正在做的是我在 frmFlashIntro 中创建了一个属性,并为它们添加了 get 和 set 方法(它们都是空白的)

public Form FormfrmMainRef { get; set; }

我将此代码添加到点击事件中。

frmMain fm = new frmMain();
this.FormfrmMainRef = fm;
FormfrmMainRef.Show();

现在这有效地显示了我的 frmMain 但保持 frmFlashIntro 也在运行所以我这样做了

frmFlashIntro fi=new frmFlashIntro();
fi.Close();//checked with dispose also

我知道我在最后一步做错了什么。谁能告诉我如何关闭该表单并释放它所持有的资源。

我也不想使用 MDI

【问题讨论】:

    标签: c# winforms forms navigation


    【解决方案1】:

    看起来 frmMain 没有引用原始的 frmFlashIntro。你的代码

    frmFlashIntro fi=new frmFlashIntro();
    fi.Close();//checked with dispose also
    

    实际上会创建第二个 frmFlashIntro,因此当您调用 fi.Close() 时,您实际上是在关闭第二个表单,而不是原始表单。

    从理论上讲,您应该能够向您的 frmMain 添加一个属性,该属性是对 frmFlashIntro 的引用,然后在其上调用 Dispose,例如

    frmMain fm = new frmMain(); this.FormfrmMainRef = fm; fm.FormIntroRef = 这个; FormfrmMainRef.Show();

    然后在frmMain的load事件中,添加对FormIntroRef.close()的调用

    好的,但是,除此之外,我认为解决这个问题的最好方法是更新 Program.cs 文件,然后有类似的东西

    frmFlashIntro flashIntro = new frmFlashIntro
    frmFlashIntro.ShowDialog();
    frmMain mainForm = new frmMain()
    Application.Run(frmMain);
    

    哦,还有一个旁注,通常,类型以大写字母开头,这些类型的实例以小写字母开头,并且是驼峰式的。所以你通常会有类似的东西

    MainForm frmMain = new MainForm()
    

    这应该会达到您想要的结果。

    【讨论】:

    • 它说需要一个对象引用来执行此操作..在 program.cs 文件中创建和 obj 是否很好?如果我在 frmMain 中有许多命令按钮并且每个命令按钮都打开一个新表单怎么办。我该如何解决?
    • 从主窗体打开新窗体没什么大不了的。你也有这方面的问题吗?它会给你什么错误?
    • 不,打开表单没有问题,问题是当我处理它们时程序退出。你能告诉我如何使用事件处理程序编辑 program.cs 吗?例如,如果我单击主窗体中的 4 个按钮之一,我如何在这些单击事件上打开新窗体。如果你能给我指出一篇同样可以的文章..但如果你能给我一些与我的问题有关的例子会更好..谢谢..对于那个回复..我在 program.cs 中创建了一个对象,它完美运行..我现在需要通过点击事件来控制流程
    • 您可能不想开始在 Program.cs 中放置事件处理程序(尽管没有任何理由不能这样做)。
    • 要打开新表单,只需将以下两行放入事件处理程序 ChildForm newForm = new ChildForm(); newForm.Show();如果需要模态窗口,也可以使用 newForm.ShowDialog()。
    【解决方案2】:

    您是否尝试使用 fi.Dispose() 处理表单?

    【讨论】:

    • 是的,frmFlashIntro 仍然保留在内存中。那不应该发生吧?
    • 是的,Dispose 应该释放表单使用的所有资源!
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2018-04-17
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多