如何在不丢失数据的情况下返回到上一个表单

本文关键字:返回 情况下 上一个 表单 数据 | 更新日期: 2023-09-27 18:04:43

我有第一个表单,用户可以在其中为自己设计酒店。在从创建的楼层点击创建的房间后,用户将信息引入从第一表单打开的第二表单,以便预订该房间。当点击第二个表单上的按钮时,表单应该消失,将数据发送到第一个表单,然后将其保存到第一个表格中的文件中。

我的问题是,当我试图隐藏或关闭第二个表单时,它要么退出应用程序,要么只是隐藏选项卡

有人能告诉我如何关闭第二个表单并返回到第一个表单而不丢失任何数据、任何按钮、任何文本或组合框中的任何信息示例吗。

代码方面,这就是我在程序.cs:中所拥有的

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 myStart = new Form1();
            if (myStart.ShowDialog() == DialogResult.OK)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            else
            {
                Application.Exit();
            }
        }

这就是我试图放在关闭第二个表单的按钮上的内容,但它不起作用:

Form2Reservations f2 = new Form2Reservations();
            f2.Close();

我也试过:

var main = new Form1();
           main.Show();
           main.BringToFront(); , but it gives me a new Form1 and I do not want to lose everything that I already had in Form1.

我也尝试了this.Close();this.Hide();,但第一个关闭了整个应用程序,第二个只将两个选项卡都放在工具栏上。

此外,我是C#的初学者,我没有参加任何大学级别的课程,我只是在互联网和教程的帮助下自学。

谢谢。

第二次编辑:当我打开我的第二张表格时,我在表格1:中使用此代码

Form2Reservations f2 = new Form2Reservations();
                f2.receiveDataFromForm1(typeOfRoom, numberOfTheRoom, floor);
                f2.ShowDialog();
                this.Hide();

编辑后的changeRoom_Click如下所示:

private void changeRoomButton_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.Close();
        }

带有静态void Main((的Program.cs代码看起来仍然相同。

我的想法是:有没有可能我没有正确打开第二种形式,所以当我想关闭第二种格式时,它会关闭它们,因为它们在某种程度上是紧密相连的,this.Close()指的是这两种形式?这可能吗?当我宣布第二种形式的开始时,我的错误会出现在第一种形式吗?

如何在不丢失数据的情况下返回到上一个表单

您正在检查DialogResult是否设置为"OK"。但是您没有在关闭窗体之前设置DialogResult,这就是为什么它会在If语句中返回False并退出应用程序。

您需要添加this.DialogResult = System.Windows.Forms.DialogResult.OK;changeRoomButton_Click中关闭表单之前。

--编辑:

让我们再试一次。

您在实际显示表单之前就已经调用了receiveDataFromForm1,因此它可能不会返回任何内容。此外,在调用ShowDialog时,您不需要隐藏现有表单,因为它将一直保持在顶部,直到您关闭它。

你的代码真的一团糟,所以我只举一些例子来帮助你进步;

Program.cs:中

        frmReservations reservations = new frmReservations();
        if (reservations.ShowDialog() == DialogResult.OK)
        {
            string result = reservations.yourDesiredResult;
            Application.Run(new frmMain(result));
        }
        else
        {
            Application.Exit();
        }

现在,在frmReservations:内部

public partial class frmReservations : Form
{
    public string yourDesiredResult = string.Empty;
    private void btnClose_Click(object sender, EventArgs e)
    {
        this.DialogResult = System.Windows.Forms.DialogResult.OK;
        this.yourDesiredResult = "I've been set!";
        this.Close();
    }
}

现在,在frmMain中,您必须再次收到我们从frmReservations收到的值,并在Program.cs:中设置

public partial class frmMain : Form
{
      public frmMain(string resultFromReservations)
      {
           InitializeComponent();
           //resultFromReservations holds the string: I've been set
      }
}

这只是一个例子,向您展示了实现这一点的多种方法之一,您现在必须在程序中实现它。

我发现了我的错误。它在Program.cs中:我有:

static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 myStart = new Form1();
            Form2Reservations myLogin = new Form2Reservations();
            if (myStart.ShowDialog() == DialogResult.OK)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(myLogin);
            }
            else
            {
                Application.Exit(); // here was the mistake
            }
        }

我所要做的就是将Application.Exit();更改为Application.Run(myStart);,但我也需要在关闭第二个表单的第二个窗体按钮中包括这一行:

this.DialogResult = System.Windows.Forms.DialogResult.OK;

谢谢你们的帮助。如果没有你的帮助,我不可能把它修好。