我目前有两个Winforms打开。两个中的一个是登录表单。现在根据我的要求,如果用户输入正确的凭据,则需要关闭这两个打开的表单并打开新表单。 意味着我必须关闭打开的winforms并在Login窗体的按钮单击事件上打开新的Winform。 这里我不确切知道哪些窗口是打开的,因为登录表单窗口来自每个表单上的菜单按钮单击事件 请帮帮我。谢谢。
答案 0 :(得分:0)
您可以遍历Application.OpenForms
集合并关闭所需内容。
答案 1 :(得分:0)
试试这个:
foreach (Form f in Application.OpenForms)
{
f.Close();
}
或使用for
循环:
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
Application.OpenForms[i].Close();
}
或创建表单列表:
List<Form> openForms = new List<Form>();
foreach (Form f in Application.OpenForms)
openForms.Add(f);
foreach (Form f in openForms)
{
f.Close();
}
根据您的要求,关闭除login
表单以外的所有其他表单,然后显示该表单。
foreach (Form f in Application.OpenForms)
{
if(f.Name!="frmLogin") //Closing all other
f.Close(); //forms
}
现在激活登录表单。
frmLogin.Show();
frmLogin.Focus();
Application.OpenForms
获取应用程序拥有的打开表单的集合。详细了解Application.OpenForms。
答案 2 :(得分:0)
您不能像前面的回复中所建议的那样使用foreach来关闭表单。这是因为foreach不能用于更改枚举表单列表(当你关闭它们时,你会得到一个运行时错误)。即使您使用for循环,也必须检查主窗体是否也未被错误关闭...
for(int i=0; i< Application.OpenForms.Count; i++)
{
Form f = Application.OpenForms[i];
if(f != this)
f.Close();
}
相反,您可以尝试以下逻辑。 这两种形式从何处加载?它是从主要形式?我假设两者都是使用Form.Show()方法显示的。
在登录表单登录按钮处理程序中,我接受对主窗体的引用。当验证成功时,我会在父表单中调用一个函数LoginSuccessful(),它将遍历打开的表单并关闭它们。
public partial class FormMain : Form
{
LoginForm loginForm;
OtherForm otherForm;
public FormMain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
loginForm = new LoginForm(this);
otherForm = new OtherForm();
loginForm.Show();
otherForm.Show();
}
public void LoginSuccessful()
{
loginForm.Close();
otherForm.Close();
OtherForm thirdForm = new OtherForm();
thirdForm.Show();
}
}
LoginForm代码如下:
public partial class LoginForm : Form
{
FormMain parent;
bool bLoginSuccessful = false;
public LoginForm(FormMain parent)
{
InitializeComponent();
this.parent = parent;
}
private void button1_Click(object sender, EventArgs e)
{
bLoginSuccessful = true;
Thread.Sleep(5000);
if (bLoginSuccessful == true)
parent.LoginSuccessful();
}
}
这可以帮助你解决问题...当然,这不是最好的方法......这完全取决于你的方法。如果你的要求更详细,我可能会想出更好的方法。
答案 3 :(得分:0)
在您的登录表单中,将默认构造函数设为私有,并添加一个新构造函数和一个私有成员,如下所示:
private Form _callerform;
private LoginForm()
{
InitializeComponent();
}
public LoginForm(Form caller)
{
InitializeComponent();
}
现在,在LoginForm上的click按钮事件中,尝试这样的事情:
Form SomeOtherForm = new Form();
SomeOtherForm.Show();
// Hide login and caller form
Hide();
_callerForm.Hide();
现在,您已隐藏了几个表单并打开了一个新表单。当用户关闭应用程序时,您还需要关闭其他表单。所以,
void Application_ApplicationExit(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
form.Close();
}
}