如何打开一个新窗体然后从第二个窗体回到第一个窗体而不关闭并重新打开第一个窗体

How to open a new form then from the second form go back to the first form without closing and reopening the first form

我正在尝试模拟登录应用程序。我想从主窗体登录窗体(登录成功时)打开。我在主窗体上有一个按钮,单击该按钮时必须冻结主窗体,打开登录窗体,并在从登录窗体登录后解冻相同的主窗体

我举个例子:

简单的登录和验证。

重要代码:

Login_in f2 = new Login_in(); //Create login window
this.Hide(); //Hide the main window
f2.ShowDialog(); //Show login window
this.Show(); //Show main window

主要window:

private void Button1_Click(object sender, EventArgs e) 
{
    Login_in f2 = new Login_in();

    while (true)
    {
        this.Hide();
        f2.ShowDialog();

        if (f2.DialogResult == DialogResult.OK)
        {
            this.Show();
            MessageBox.Show("Verification Success!");
            break;
        } 
        else if (f2.DialogResult == DialogResult.Cancel)
        {
            this.Show();
            MessageBox.Show("Verification Failed");
            break;
        }

        f2.Close();
    }
}

登录Window:

private void Button1_Click(object sender, EventArgs e) 
{
    //Personal test database
    string myconn = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = Test; Integrated Security = True";
    SqlConnection conn = new SqlConnection(myconn);
    string sql= $"select * from Test.dbo.demoAccount where userid=@UserId and password=@PassWord";
        try
        {
        conn.Open();
        SqlCommand sqlCommand = new SqlCommand(sql, conn);
        //sqlCommand.Parameters.AddWithValue("@UserId", AccountTb.Text.Trim())
        //sqlCommand.Parameters.AddWithValue("@PassWord", PassTb.Text.Trim());
        sqlCommand.Parameters.Add("@UserId", SqlDbType.VarChar, 8).Value = AccountTb.Text.Trim();
        sqlCommand.Parameters.Add("@PassWord", SqlDbType.Char, 8).Value = PassTb.Text.Trim();      
        SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
        if (sqlDataReader.HasRows) //Satisfy the user name and password are consistent, enter the next interface
        {
            this.DialogResult = DialogResult.OK;
        } 
        else
        {
            this.DialogResult = DialogResult.Cancel;
        }

        conn.Close();
    } 
    catch (Exception o)
    {
        MessageBox.Show(o.ToString());
    }
}

输出:

如果您对我的代码有疑问,请在下方发表评论。更新问题,我会继续改进

已更新:

  1. 在子节点中添加委托和事件window.The类似的代码是follows.Because它需要传递一个字符串,委托需要带一个字符串参数。
 public delegate void MyAccountDelegate(string account);
 public event MyAccountDelegate MyAccountEvent;
  1. 在child中设置登录按钮的事件window点击时调用上面的事件,将需要传递的字符串传给事件
if (sqlDataReader.HasRows)//Satisfy the user name and password are consistent, enter the next interface
{
    this.DialogResult = DialogResult.OK;
    MyAccountEvent(AccountTb.Text);//Add account information
} else
{
    this.DialogResult = DialogResult.Cancel;
}
  1. 在mainwindow中添加显示返回信息的方法,与参与MyAccountDelegate委托一样
private void DisplayMyAccount(string account) {
    listBox1.Items.Add(account);
}
  1. 添加以下代码在父window的登录按钮中打开子window:
 f2.MyAccountEvent += new Login_in.MyAccountDelegate(DisplayMyAccount);
 //f2.MyAccountEvent += DisplayMyAccount;

提示:这里使用的(closed)mainwindow是一个隐藏方法,并不是真正的关闭,所以不会影响mainwindow信息:

this.Hide();
this.show();

输出:

根据自己的需要自行更改,请检查我是否理解你的意思。