我在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();
}
}
}
答案 0 :(得分:5)
这是您程序中的错误。当你有一个表单的两个实例(称为A和B)时,你显然不能使用ShowDialog连续显示另一个。如果你能做到这一点,那就意味着A显示B模态,然后B然后显示A模态,然后A然后显示模态B等。这就像建造一个有两块砖的房子,你只需要继续使用底砖和把它放在另一个上面。
您最好的解决方案是不要将这些表单设置为静态,而只是根据需要创建每个表单的新实例。您的第二个最佳解决方案是使用Show而不是ShowDialog;如果您一次只显示其中一个表格,ShowDialog没有任何意义。
静态形式几乎总是一个坏主意(而且我对“差不多”很有礼貌)。如果您的表单需要很长时间才能创建,那么您应该确定加载和缓存该资源的时间是多少,而不是尝试将整个表单缓存为静态。
答案 1 :(得分:4)
这是来自MSDN:
当表单显示为模态时 在对话框中,单击“关闭”按钮 (带有X的按钮 形式的右上角)导致 要隐藏的形式和 要设置的DialogResult属性 DialogResult.Cancel。与无模式不同 表单,不调用Close方法 当用户使用.NET Framework时 单击a的关闭表单按钮 对话框或设置的值 DialogResult属性。而是 表单被隐藏,可以再次显示 没有创建新的实例 对话框。因为表格显示 由于没有关闭对话框,你 必须调用Dispose方法 在不再需要表单时形成表单 按你的申请。
因此,一旦您使用ShowDialog显示表单并且您现在要关闭它,只需让它返回DialogResult.Cancel 这将隐藏(它仍将在内存中)您的第一个表单。现在,您可以在第二个表单上调用ShowDialog。再次,如果你想切换到第一个表单然后让第二个表单返回DialogResult.Cancel,现在只需在第一个表单上调用ShowDialog。
答案 2 :(得分:1)
尝试使用Hide()而不是Close()。我过去遇到过类似的问题,而Hide()也为我工作过。
答案 3 :(得分:1)
我认为你应该像对方法调用一样对待模态对话框,并尝试使用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)按钮。
答案 4 :(得分:0)
查看Close
和Hide
之间的区别。以及Show
和ShowDialog
之间的区别。
我不清楚你想要达到什么目标;您(仅部分)描述您在代码中所做的事情以及您遇到的问题的症状。你能描述一下你想要做什么吗?
如果您的目标是从主窗口显示两个对话框,其中只有两个中的一个可以同时显示,那么可能有比使用两个静态(=全局)公共Form
更好的解决方案您使用ShowDialog
显示的实例。
您是否考虑过使用一个Form
对话框,根据具体情况改变外观?