C# 如何在注销用户时隐藏/关闭所有表单并显示登录?
当用户将应用程序闲置一段时间后,我无法确定如何关闭所有打开的表单并打开登录表单 下面的代码几乎可以正常工作,但非登录表单仍然可以在任务栏中看到并单击 我错过了什么?另外,我最初是否应该将C# 如何在注销用户时隐藏/关闭所有表单并显示登录?,c#,winforms,C#,Winforms,当用户将应用程序闲置一段时间后,我无法确定如何关闭所有打开的表单并打开登录表单 下面的代码几乎可以正常工作,但非登录表单仍然可以在任务栏中看到并单击 我错过了什么?另外,我最初是否应该将var frm设置为其他值 public static void Logout() { var frm = Form.ActiveForm; for (int ix = Application.OpenForms.Count - 1; ix >= 0; --i
var frm
设置为其他值
public static void Logout()
{
var frm = Form.ActiveForm;
for (int ix = Application.OpenForms.Count - 1; ix >= 0; --ix)
{
frm = Application.OpenForms[ix];
if (frm.GetType() != typeof(Login))
{
logoutIdleUser = true;
}
}
if (logoutIdleUser)
{
// Logout user
MessageBox.Show("You will be logged out.", "Session Expired!");
frm.Hide();
new Login().Show();
}
}
关闭操作与搜索打开的表单无关,因此只关闭一个表单。通过更改
for
循环以包含关闭事件,您可以解决该问题。另外,我改为foreach
,因为我们使用frm
作为变量,以使其更具可读性。我们使用它作为循环变量并在那里声明它,而不是检查活动表单
foreach (Form frm in Application.OpenForms)
{
if (frm.GetType() != typeof(Login))
{
frm.Hide();
}
new Login().Show();
MessageBox.Show("You will be logged out.", "Session Expired!");
}
这就是我所采用的实现方式。它在登录表单的顶部显示messagebox,而不是以前的表单。 这并不完全是我在问题中寻找的,但它是该项目可以接受的。感谢@CDove的帮助
public static void Logout()
{
foreach (Form frm in Application.OpenForms)
{
if (frm.GetType() != typeof(Login))
{
frm.Hide();
logoutIdleUser = true;
}
}
if (logoutIdleUser)
{
new Login().Show();
MessageBox.Show("You will be logged out.", "Session Expired!");
}
}
您并不是隐藏所有窗体,而是仅隐藏活动窗体。尝试将frm.Hide()移动到for(…)loopYes可以,但是我希望最后一个表单在messagebox下面仍然可见,直到在messagebox上单击OK按钮。很抱歉,我应该把这个放在问题中。然后,将这个添加到循环中:if(Form.ActiveForm!=frm)frm.Hide()ActiveForm为null。我想是因为代码在Program.csShow代码中。谢谢,但我得到编译错误“object”不包含“Hide”的定义,并且找不到接受“object”类型第一个参数的扩展方法“Hide”,这很奇怪,因为
Application.OpenForms
返回FormCollection
,它应该只包含从Form
继承的对象。通过上面的编辑尝试明确说明frm
是一个表单
。更新后的答案给出了此错误集合已修改的信息;枚举操作不能执行。我想是因为集合随着新显示的登录表单添加到集合中而发生了更改。您可以将隐藏调用移动到登录框显示之后。只需改变操作顺序。显示注销警告,并使其返回布尔值。如果为true,则隐藏所有表单,而不是使用类型条件