c# - 在 C# Winform 上使用显示对话框时出现非常奇怪的错误

标签 c# winforms dialog modal-dialog

我在 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/

相关文章:

c# - 如何将 Linq 扩展方法重写为委托(delegate)?

c# - 事务应该处于 WCF 服务级别还是数据库访问级别?

c# - TextBox的OnPaint方法没有被调用?

winforms - PictureBox的MouseWheel事件?

android - AlertDialog.dismiss()?

c# - C#/JIT 编译器是否有机会删除包含将变量分配给属性的行,这些行以后不会使用?

c# - 尽管具有有效的外键, Entity Framework 仍不生成导航属性

c# - 饼图切片点击

wpf - 使用 MVVM Foundation Messenger 显示对话框

javascript - 将对话框字段值设置为选定文本