C# 在不关闭主窗体的情况下关闭第二个windows窗体时出现问题
在c#中,我有两种形式:Windows Form1和Windows Form2。 当我单击Form1中的链接标签时,会显示第二个表单。但是当我关闭第二个窗体时,我的第一个Windows窗体也会关闭 我的主要表格是:C# 在不关闭主窗体的情况下关闭第二个windows窗体时出现问题,c#,winforms,C#,Winforms,在c#中,我有两种形式:Windows Form1和Windows Form2。 当我单击Form1中的链接标签时,会显示第二个表单。但是当我关闭第二个窗体时,我的第一个Windows窗体也会关闭 我的主要表格是: namespace Windows_Forms_Basics { public partial class ShowLocationOnMapForm : Form { private string latitude; private
namespace Windows_Forms_Basics
{
public partial class ShowLocationOnMapForm : Form
{
private string latitude;
private string longitute;
private GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();
public ShowLocationOnMapForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
watcher = new GeoCoordinateWatcher();
// Catch the StatusChanged event.
watcher.StatusChanged += Watcher_StatusChanged;
// Start the watcher.
watcher.Start();
}
private void button_ShowOnMap_Click(object sender, EventArgs e)
{
textBox_Latitude.Text = latitude;
textBox_Longtitude.Text = longitute;
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "<Pending>")]
private void Watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e) // Find GeoLocation of Device
{
try
{
if (e.Status == GeoPositionStatus.Ready)
{
// Display the latitude and longitude.
if (watcher.Position.Location.IsUnknown)
{
latitude = "0";
longitute = "0";
}
else
{
latitude = watcher.Position.Location.Latitude.ToString();
longitute = watcher.Position.Location.Longitude.ToString();
}
}
else
{
latitude = "0";
longitute = "0";
}
}
catch (Exception)
{
latitude = "0";
longitute = "0";
}
}
private void label1_Click(object sender, EventArgs e)
{
}
private HelpForm form2 = new HelpForm();
private void linkLabel_help_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
this.Hide();
form2.Show();
}
}
}
你知道如何解决这个问题吗?我试图通过在表单2中放置一个“返回表单1”按钮来解决这个问题。这是可行的,解决方案如下: 在我的表格1中,我有:
private Form2 form2 = new HelpForm();
private void linkLabel_help_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
this.Hide();
form2.Show();
}
在我的第二份表格中,我有:
private void button_BackToForm1_Click(object sender, EventArgs e)
{
HelpForm form1 = new HelpForm();
this.Hide();
form1.Show();
}
但问题是,如果我单击关闭按钮(窗口右上角)而不是第二个表单上的GoBack按钮,则Form1和Form2会同时关闭。我猜您可能会“混淆”表单,并且一个表单“能够”访问另一个表单。让我们先看一下您最初问题中的代码位
private HelpForm form2 = new HelpForm();
private void linkLabel_help_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
this.Hide();
form2.Show();
}
此代码是从(看起来是)名为ShowLocationOnMapForm的表单调用的。
此表单上有一个名为LinkLabel\u help
的LinkLabel
,其LinkClicked
事件已连接,如上图所示。
此外,似乎还有一个“全局”变量form2
,它是一个HelpForm
对象(上面代码的第一行),是另一种形式。无需在ShowLocationOnMapForm.
中创建此“全局”表单变量…。然而,我们将继续,因为这在目前并不相关
当用户“单击”LinkLabel时,将触发上述方法。
在方法的第一行
this.Hide();
将“隐藏”当前表单ShowLocationOnMapForm
…并使用以下行“显示”第二个表单(帮助表单)
form2.Show();
从表面上看,这似乎是正确的,但是,有一个问题,我猜你错过了。问题是
如何“取消隐藏”第一个表单ShowLocationOnMapForm
第二个表单(HelpForm)是“显示的”,但是,它不会知道关于第一个表单的任何信息。在这种情况下,第一个表单基本上丢失了,您无法访问它。因此,当您尝试行…form1.Show()时在第二种形式中,编译器会抱怨,因为它不知道form1
是什么。在这段代码中,无法返回到第一个表单。它不仅对用户隐藏,而且从第二个表单的角度来看,“代码”也看不到它
您的错误解决方案不仅“创建”了另一个表单1,而且对第二个表单也是如此
有鉴于此,很明显,如果您想保持对第一个表单的访问……那么您必须使用ShowDialog
而不是Show
,或者将第一个表单传递给第二个表单
由于不清楚您希望这些表单“如何”交互,我只能提供两(2)种方法,您至少可以使用它们来保持对第一种表单的访问
1) 显示第二个表单时,请使用ShowDialog
而不是Show
。它可能看起来像
private void linkLabel_help_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
HelpForm form2 = new HelpForm();
this.Hide();
form2.ShowDialog();
this.Show();
}
在上面的代码中,ShowDialog
将“停止”第一个表单中的代码执行,并等待第二个表单(表单2)关闭。执行时,第一个表单隐藏,然后显示第二个表单,但是,与Show
命令不同,行this.Show()在第二个窗体关闭之前,不会执行代码>。我猜这可能就是你要找的
2) 将第一个表单传递给第二个表单,让第二个表单“访问”第一个表单
这将要求第二个表单具有一个“构造函数”,该构造函数将ShowLocationOnMapForm
对象作为参数。这样,第二个表单就可以创建一个类型为ShowLocationOnMapForm
的“全局”变量,该变量“指向”第一个表单。构造函数可能看起来像
private ShowLocationOnMapForm parentForm;
public HelpForm(ShowLocationOnMapForm parent) {
InitializeComponent();
parentForm = parent;
}
在第一个表单中,您将使用
HelpForm form2 = new HelpForm(this);
使用这种方法,第二个表单将可以完全访问第一个表单。您可以按照描述添加“后退”按钮,只需执行以下行…ParentForm.Show()
但是,我建议您也连接第二个表单FormClose
事件并显示第一个表单,否则,如果用户单击关闭按钮(右上角)而没有单击“后退”按钮,那么您将再次丢失第一个表单
如果不“确切地”知道您希望这些表单如何交互,就很难提供完整的解决方案
还有其他方法可以实现这一点,但是这些方法应该适用于大多数情况
我希望这是有意义和有帮助的。我对您的评论表示怀疑……”但当我关闭第二个窗体时,我的第一个Windows窗体也会关闭。“…除非您的代码正在关闭第一个窗体……否则不应像您描述的那样发生这种情况。当显示第二个窗体时,是否希望第一个窗体“隐藏”?如果是这样,那么您必须将某些内容(如form1本身)传递给第二个表单,否则,您将如何“取消隐藏”第一个表单?我猜在第二个表单上使用ShowDialog
,在第二个表单关闭时“取消隐藏”第一个表单。如您所见,在我的代码中,我没有关闭表单1,但关闭表单2,两个表单都消失了。或者对我来说,这两个应用程序都关闭了,应用程序退出了,我可以修改代码并重新构建。如果它们是隐藏的,那么在我退出调试模式之前,我将无法在代码中实现任何更改并重建。对吗?按钮\u BackToForm1\u Click
方法看起来不像是“返回”到原始表单1…它看起来像是在“创建”一个新表单。你确定你没有两(2)个现有表单1,其中一个是隐藏的吗?事实上,每次我隐藏一个表单时,通过切换窗口,转到我创建的另一个表单
HelpForm form2 = new HelpForm(this);