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

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

我只想使用ShowDialog和Close在两个窗体之间进行切换,但是当尝试关闭第二个窗体并使用showdialog重新打开第一个窗体时,它说当窗体已经可见时我不能使用showDialog,但是由于我不正确在显示第二种形式之前将其关闭。

它要求我在使用showdialog之前将表单的visible属性设置为false,所以我做到了

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.ShowDialog();
    }

但是然后它说我不能使用ShowDialog,因为该窗体已经在Dialog Mode中显示,并且我必须关闭它。所以我做了它要求的

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.Close();
        SecondForm.ShowDialog();
    }

但是它仍然假装该窗体已经用ShowDialog打开!

这是我的编还是Winform中的Bug?

更新:这是我在第五个答案中张贴的全部代码(我想使用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();
          }
      }
  }

参考方案

这是从MSDN:

当表单显示为模式时
对话框,单击关闭按钮
(按钮旁边带有X的按钮
表单的右上角)原因
要隐藏的表单以及
DialogResult属性设置为
DialogResult.Cancel。不像无模
窗体,不调用Close方法
由.NET Framework当用户
单击一个的关闭表单按钮
对话框或设置
DialogResult属性。相反,
表单是隐藏的,可以再次显示
而不创建新的
对话框。因为显示了表格
由于对话框未关闭,您
必须调用的Dispose方法
当不再需要表格时
根据您的应用。

因此,一旦您使用ShowDialog显示了一个表单并且现在想要关闭它,就让它返回DialogResult.Cancel
这将隐藏(仍将保留在内存中)您的第一个表单。现在,您可以在第二个窗体上调用ShowDialog。同样,如果要切换到第一个窗体,则让第二个窗体返回DialogResult.Cancel,现在只需在第一个窗体上调用ShowDialog。

在C#.Net中找到工作项目目录 - c#

我用过Directory.getCurrentDirectory();它只给C:\ Windows \ SysWOW64但是我需要获取Visual Studio默认项目文件夹,我该如何获取?例如:C:\ Users \ knallasi \ Documents \ Visual Studio 2010 \ Projects \ SampleApp我们如何在项…

在C#中,基本构造函数调用中的一种用法如何解决多个枚举警告? - c#

以下代码向我警告了IEnumerable可能的多个枚举:public ClassName(IEnumerable<OtherClassName> models) : base(models) { _models.AddRange(models); } 由于“基本”调用,消除此警告的常规解决方案不起作用。我无法转换为列表,因为没有地方可以存储该列表…

在C#中,如果关联的catch块引发异常,是否可以强制控制通过finally块? - c#

我知道在Java中,如果catch子句捕获了异常,并且其catch块引发了异常,则控制将在线程终止之前传递与关联的finally块(如果有)。但是,在C#中似乎并非如此。可以通过在try-catch语句的try块中放入try-finally语句和引发异常的catch块,来在C#中几乎反映出这种行为,但是,例如,如果finally块应该包含处理应记录异常的St…

字段初始化程序访问“this”:在C#中无效,在Java中有效? - c#

Improve this question 一,简介:这段代码:class C { int i = 5; byte[] s = new byte[i]; } 无法编译,并出现以下错误: 字段初始值设定项不能引用非静态字段,方法或属性“C.i”Resharper说类似的话:无法在静态上下文中访问非静态字段i。这与C# spec says一致-字段初始值设定项无…

在C#中将lambda函数作为命名参数传递 - c#

编译这个简单的程序:class Program { static void Foo( Action bar ) { bar(); } static void Main( string[] args ) { Foo( () => Console.WriteLine( "42" ) ); } } 那里没什么奇怪的。如果我们在lambda…