C# 在不关闭主窗体的情况下关闭第二个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

在c#中,我有两种形式:Windows Form1和Windows Form2。 当我单击Form1中的链接标签时,会显示第二个表单。但是当我关闭第二个窗体时,我的第一个Windows窗体也会关闭

我的主要表格是:

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);