c#WinForms-显示静态引用中的隐藏窗口

本文关键字:隐藏 窗口 引用 显示 静态 c#WinForms- | 更新日期: 2023-09-27 17:59:52

我在WinForms项目中将引用传递到我的窗口,然后检索它们时遇到问题。当我创建另一个(主)表单并在按钮事件中隐藏登录表单时,我有登录表单(我不想破坏这里的登录引用,所以我把它保存在静态类中):

private void btnLog_Click(object sender, EventArgs e)
            {
                if (CheckIfPasswordIsCorrect((int)DataSetUsers.Tables[0].Rows[cmbUsers.SelectedIndex][0]
                                            , txtPassword.Text.Trim()))
                {
                    GlobalData.LoginFormRef = this; //passing reference to Login form into static class
                    this.Hide(); //hidding Login form
                    MainForm mainForm = new MainForm();
                    mainForm.Show();
                }
                else
                {
                    MessageBox.Show("Wrong password");
                    txtPassword.Focus();
                }
            } 

GlobalData是带有静态对象GlobalData.LoginFormRef的静态类,因此我可以保留我的登录表单引用。

然后,如果我从主表单注销并想返回登录表单,我会收到一个错误,或者只是我的应用程序关闭:

private void btnLogOut_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
            {
                GlobalData.LoggedUser = null;
                if (GlobalData.LoginFormRef != null)
                {
                    GlobalData.LoginFormRef.Show(); //trying to show my login form back
                }
                this.Close(); //closing Main form
                this.Dispose(true); //destroying main form
            } 

当我关闭主窗体并试图调用Login窗体时,它会立即消失,或者我收到一个错误System.ObjectDisposedException。我不明白为什么。我在静态类中引用了登录表单。。。。如何销毁主表单并再次显示登录表单?

c#WinForms-显示静态引用中的隐藏窗口

您是否使用Application.Run(new MainForm())启动了应用程序?

如果您这样做了,那么它会向关闭UI线程的事件处理程序注册MainForm的关闭事件。这将处理包括登录表单在内的所有表单(并将退出应用程序,假设您没有任何活动的非后台线程)。

请参阅Application.Run(Form)的msdn中的备注:https://msdn.microsoft.com/en-us/library/ms157902(v=vs.110).aspx