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

时间:2014-05-22 16:21:55

标签: c# winforms

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

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

任何人都可以告诉我如何关闭第二个表单并返回第一个表单而不会丢失组合框中的任何数据,任何按钮,任何文本或任何信息示例。

代码明智就是我在Program.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代码看起来仍然相同。

我的想法如下:我是否有可能无法正确打开第二个表单,所以当我想关闭第二个表单时,它会关闭它们,因为它们是紧密相连的{{1}是指两种形式?那可能吗 ?当我打电话给第二张表格时,我的错误是第一种形式吗?

2 个答案:

答案 0 :(得分:3)

您正在检查DialogResult是否设置为'确定'。但是在关闭表单之前你没有设置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
      }
}

这只是向您展示执行此操作的众多方法之一的示例,您现在必须在程序中实现它。

答案 1 :(得分:0)

我发现了我的错误。它在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;

谢谢你们的帮助。没有你的帮助,我无法修复它。