[英]How to go back to the previous form with no loss of data
我有一個第一種形式,用戶可以自己設計一個旅館。 在從創建的樓層上單擊創建的房間之后,用戶將信息引入第二個表單,該表單從第一個表單打開以保留該房間。 當單擊第二個表單上的按鈕時,該表單應該消失,將數據發送到第一個表單,然后將其保存到第一個表單中的文件中。
我的問題是,當我嘗試隱藏或關閉第二個表單時,它要么退出應用程序,要么只是隱藏選項卡。
誰能告訴我如何關閉第二個窗體並回到第一個窗體,而又不會丟失組合框中的任何數據,任何按鈕,任何文本或任何信息示例。
我在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代碼看起來仍然相同。
我的想法如下:是否有可能我沒有正確打開第二個窗體,所以當我想關閉第二個窗體時,它會關閉兩個窗體,因為它們以某種方式緊密連接並且this.Close()
引用兩種形式? 那可能嗎 ? 當我調用第二個表格的開頭時,我的錯誤是否會出現在第一個表格中?
您正在檢查DialogResult是否設置為“ OK”。 但是,您沒有在關閉表單之前設置DialogResult,這就是為什么它將在If語句上返回False並退出應用程序的原因。
您需要添加this.DialogResult = System.Windows.Forms.DialogResult.OK;
在changeRoomButton_Click
關閉表單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;
謝謝你們的幫助。 沒有您的幫助,我無法修復它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.