【发布时间】:2021-04-15 10:22:27
【问题描述】:
这似乎是一个相当明显且非常新人的问题(确实如此),但我只是试图在 C# Winforms 中的多种形式之间进行转换,并且不知何故遇到了许多复杂情况:
- 首先,我使用了明显的:
frm_hub hub = new frm_hub(); hub.Show();
但是,每次运行此代码时,都会创建一个新的 frm_hub 实例并使用 hub.Close();不会工作,因为它没有关闭 frm_hub 的同一个新实例
- 是否有一种方法可以从不同的表单中关闭相同的表单实例 - 比如使用全局变量?或者有什么方法可以集成 Close();所以整个程序继续运行并显示新的表单?
- 作为上述问题的一种可能解决方案,我尝试将相同的形式存储为变量:
frm_hub hub = new frm_hub(); private void OpenForm() { hub.Show() }
但是运行时错误:'System.StackOverflowException: 'System.StackOverflowException' 类型的异常被抛出。当我尝试使用相同的策略将表单存储为两个表单中的变量时,正在显示。
- 为什么会出现这个错误?有什么办法可以克服吗?
- 最后,在针对这个问题的一些阅读中,我发现了控件和面板的使用,通过这种方式,我可以创建一个界面,在面板中打开不同的不同表单
但是,我的尝试需要使用锚点来使表单远程显示与设计器外观一致
- 如果我不需要调整表单大小,如何使用面板来显示不同的表单,以及如何以显示设计元素的方式显示它们的位置
再次为我初学者对术语的理解和使用道歉,请随时寻求澄清我可能没有包括在内的关键细节哈哈, 谢谢!
【问题讨论】:
-
StackOverflowException 表明您很可能在
frm_hub内创建了一个frm_hub实例(希望您能看到问题所在)。无论如何,如果您想访问多个文件中的表单,那么您应该在一个地方创建一个public static变量/属性并只使用它。或者,您可以使用Application.OpenForms.OfType<frm_hub>().FirstOrDefault()来获取当前打开的表单实例。 -
非常感谢!与公静一起创造了奇迹哈哈。作为一个有趣的问题(为了美观),您是否碰巧知道一种方法来消除 .Show() 和 Close() 之间的苛刻过渡。我在第二种形式的 Close() 之前尝试了 Thread.Sleep(50) ,但似乎仍然有闪光。使用 .ShowDialog() 可以实现更平滑的过渡,但是使用公共静态表单和 .Close() 似乎不起作用,因为 .Close() 在 .ShowDialog() 可以运行之前退出表单。如果没有,请不要担心,再次感谢您!
标签: c# forms winforms user-interface panel