我在 VS Studio 2008 Express Edition 中创建了 2 个表单,并在主程序.cs 文件中使用 public static 声明它们
我只想使用 ShowDialog 和 Close 在两个表单之间切换,但是当尝试关闭第二个表单并使用 showdialog 再次打开第一个表单时,它说当表单已经可见时我无法使用 showDialog,而事实并非如此true,因为我之前关闭了它以显示第二种形式。
它要求我在使用 showdialog 之前将表单可见属性设置为 false,所以我这样做了
internal static void CloseSecondForm(FirstForm FirstForm)
{
FirstForm .Close();
SecondForm.Visible = false;
SecondForm.ShowDialog();
}
但是它说我无法使用 ShowDialog,因为表单已经在对话框模式下显示,我必须关闭它。所以我按照它的要求做了
internal static void CloseSecondForm(FirstForm FirstForm)
{
FirstForm .Close();
SecondForm.Visible = false;
SecondForm.Close();
SecondForm.ShowDialog();
}
但它仍然假装表单已经用 ShowDialog 打开!
这是我的程序或 Winform 中的错误吗?
更新:这是我在第五个答案中发布的完整代码(我想使用 showdialog 而不是显示,因为我可能在后台有第三个表单,我不希望用户访问):
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 = new Form1();
Form2 = new Form2();
Form1.ShowDialog();
Application.Run();
}
// called from Form1 BUTTON
internal static void ShowForm2(Form1 Form1)
{
Form1.Hide();
Form2.ShowDialog();
}
// called from Form2 BUTTON
internal static void ShowForm1(Form2 Form2)
{
Form2.Hide();
Form1.ShowDialog();
}
<小时/>
我按照建议尝试了隐藏,但它也不起作用。这就是整个程序,我想做的非常简单:我最初在程序中创建了两个表单,每个表单上都有一个按钮来关闭自身并打开另一个。我将所有逻辑放在下面的program.cs中:
using System;
using System.Windows.Forms;
namespace twoforms
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
///
public static Form1 Form1;
public static Form2 Form2;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 = new Form1();
Form2 = new Form2();
Form1.ShowDialog();
Application.Run();
}
// called from Form1 BUTTON
internal static void ShowForm2(Form1 Form1)
{
Form1.Hide();
Form2.ShowDialog();
}
// called from Form2 BUTTON
internal static void ShowForm1(Form2 Form2)
{
Form2.Hide();
Form1.ShowDialog();
}
}
}
最佳答案
这是您的程序中的一个错误。当您有一个窗体的两个实例(称为 A 和 B)时,您显然无法使用 ShowDialog 连续显示一个窗体。如果你能做到这一点,那就意味着 A 以模态方式显示 B,然后 B 以模态方式显示 A,然后 A 以模态方式显示 B,等等。这就像用两 block 砖 build 一座房子,你只需继续拿走底部的砖 block ,然后将其放在另一个之上。
最好的解决方案是不要使这些表单静态化,而是根据需要创建每个表单的新实例。您的第二个最佳解决方案是使用 Show 而不是 ShowDialog;如果您一次只显示其中一种表单,则 ShowDialog 没有任何作用。
静态表单几乎总是一个坏主意(我对“几乎”很礼貌)。如果您的表单需要很长时间才能创建,您应该确定哪些资源需要很长时间才能加载并将其缓存为静态对象,而不是尝试将整个表单缓存为静态。
关于c# - 在 C# Winform 上使用显示对话框时出现非常奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218517/