我在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。
我用过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…