我在VS Studio 2008 Express Edition中创建了2个表单,并在main program.cs文件中使用public static声明它们

我只是想用ShowDialog和Close在两个表单之间切换但是当试图关闭第二个表单并再次使用showdialog打开第一个表单时,它表示当表单已经可见时我不能使用showDialog,而它不是是的,因为我在关闭之前显示第二种形式。

它要求我在使用showdialog之前将form visible属性设置为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中的错误吗?

更新:这是我在第5个答案中发布的整个代码(我想使用showdialog而不是show,因为我可能在后台有第3个表单,我不希望用户访问):

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

我按照建议使用了Hide,但它也无效。这是整个程序,我想要做的很简单:我有两个最初在程序中创建的表单,每个表单上有一个按钮关闭自己并打开另一个。我将所有逻辑放在下面的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();
          }
      }
  }
有帮助吗?

解决方案

这是来自MSDN:

  

当表单显示为模态时   在对话框中,单击“关闭”按钮   (带有X的按钮   形式的右上角)导致   要隐藏的形式和   要设置的DialogResult属性   DialogResult.Cancel。与无模式不同   表单,不调用Close方法   当用户使用.NET Framework时   单击a的关闭表单按钮   对话框或设置的值   DialogResult属性。而是   表单被隐藏,可以再次显示   没有创建新的实例   对话框。因为表格显示   由于没有关闭对话框,你   必须调用Dispose方法   在不再需要表单时形成表单   按你的申请。

因此,一旦您使用ShowDialog显示表单并且您现在要关闭它,只需让它返回DialogResult.Cancel 这将隐藏(它仍将在内存中)您的第一个表单。现在,您可以在第二个表单上调用ShowDialog。再次,如果你想切换到第一个表单然后让第二个表单返回DialogResult.Cancel,现在只需在第一个表单上调用ShowDialog。

其他提示

这是您程序中的错误。当你有一个表单的两个实例(称为A和B)时,你显然不能使用ShowDialog连续显示另一个。如果你能做到这一点,那就意味着A显示B模态,然后B然后显示A模态,然后A然后显示模态B等。这就像建造一个有两块砖的房子,你只需要继续使用底砖和把它放在另一个上面。

您最好的解决方案是不要将这些表单设置为静态,而只是根据需要创建每个表单的新实例。您的第二个最佳解决方案是使用Show而不是ShowDialog;如果您一次只显示其中一个表格,ShowDialog没有任何意义。

静态表单几乎总是一个坏主意(而且我对<!>几乎是<!>几乎是礼貌的!)。如果您的表单需要很长时间才能创建,那么您应该确定加载和缓存该资源的时间是多少,而不是尝试将整个表单缓存为静态。

尝试使用Hide()而不是Close()。我过去遇到过类似的问题,而Hide()也为我工作过。

我认为你应该像对方法调用一样对待模态对话框,并尝试使用Call to ShowDialog的结果来确定下一步要做什么?如果您需要在对话框之间切换,您应该使用某种结果(可能只是DialogResult查看我的示例)或对话框的公共属性来确定是否需要显示另一个对话框,如果您需要调用一个模式对话框另一个你应该把它想象成一堆形式,有效地(即使你在调用另一个之前让一个看不见)将一个放在另一个上。你真的想最大限度地减少这种形式的堆叠。

这是一个人为的例子,但每个表单只有一个按钮,DialogResult设置为OK。

[STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        bool exit = false;
        while (true)
        {
            if (exit) break;
            using (Form1 frm = new Form1())
            {
                switch(frm.ShowDialog())
                {
                    case DialogResult.OK:
                        break;
                    default:
                        exit = true;
                        break;
                }   
            }
            if(exit) break;
            using (Form2 frm = new Form2())
            {
                switch(frm.ShowDialog())
                {
                    case DialogResult.OK:
                        break;
                    default:
                        exit = true;
                        break;
                } 
            }

        }

    }

退出后只需单击红色关闭(x)按钮。

查看CloseHide之间的区别。以及ShowShowDialog之间的区别。

我不清楚你想要达到什么目标;您(仅部分)描述您在代码中所做的事情以及您遇到的问题的症状。你能描述一下你想要做什么吗?

如果您的目标是从主窗口显示两个对话框,其中只有两个中的一个可以同时显示,那么可能有比使用两个静态(=全局)公共Form实例更好的解决方案你用<=>显示。

您是否考虑过使用一个对话框<=>,根据具体情况改变外观?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top