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

Posted

技术标签:

【中文标题】如何打开一个新表单然后从第二个表单返回到第一个表单而不关闭并重新打开第一个表单【英文标题】:How to open a new form then from the second form go back to the first form without closing and reopening the first form 【发布时间】:2022-01-09 10:45:16 【问题描述】:

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

【问题讨论】:

所以你希望登录提示是一个模型对话框? 很抱歉,如果我遗漏了一些东西,但是,我不得不问你是否考虑过这一点。 “冻结主窗体”是什么意思?为什么关闭和重新打开表单是不可取的? 以下内容可能会有所帮助 - 尽管它是用 VB.NET 编写的:***.com/questions/69711574/… 而不是调用yourForm.Show调用yourForm.ShowDialog(this) 听起来有点鸡和蛋。您说您希望登录表单打开打开登录表单的主表单..认为您需要进一步敲定那个表单 【参考方案1】:

我举个例子:

简单的登录和验证。

重要代码:

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

主窗口:

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

登录窗口:

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

输出:

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

更新:

    在子窗口中添加委托和事件。类似代码如下。由于需要传递字符串,所以委托需要带字符串参数。
 public delegate void MyAccountDelegate(string account);
 public event MyAccountDelegate MyAccountEvent;
    设置子窗口中Login按钮的事件,在点击时调用上述事件,并将需要传递的字符串传递给事件。
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;

    增加在主窗口显示返回信息的方法,与参与MyAccountDelegate委托相同。
private void DisplayMyAccount(string account) 
    listBox1.Items.Add(account);

    添加如下代码,在父窗口的登录按钮中打开子窗口:
 f2.MyAccountEvent += new Login_in.MyAccountDelegate(DisplayMyAccount);
 //f2.MyAccountEvent += DisplayMyAccount;

提示:这里使用的(关闭)主窗口是一种隐藏方式,并不是真正关闭,所以不会影响主窗口信息:

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

输出:

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

【讨论】:

我也会阅读dbdelta.com/addwithvalue-is-evil - 它不像sql注入那么糟糕,但也值得避免在SqlCommand上使用AddWithValue(其他数据库不一定有问题,但是SQLS 确实) @JialeXue-MSFT 我无法关闭主窗体,因为我希望在使用其他帐户登录后保留在列表框中的信息 如何在不使用 sql 或文本文件的情况下保存列表框中的信息

以上是关于如何打开一个新表单然后从第二个表单返回到第一个表单而不关闭并重新打开第一个表单的主要内容,如果未能解决你的问题,请参考以下文章

将变量从访问表单传递到访问表单

从第二个线程引发事件到主线程,没有表单[重复]

从第二个屏幕导航回来并刷新页面颤动时关闭 AlertDialog

使用 PyQT 从第二个表单中捕获按钮方法

以另一种形式将文本发送到文本框而不创建新窗口

Laravel 3 - 跨多个视图传递变量