我目前有两个Winforms窗体,其中一个是Login窗体。现在根据我的要求,如果用户输入了正确的凭据,那么这两个打开的窗体需要将被关闭,并应打开新的表格。 意味着我必须关闭打开的winforms并在登录窗体的按钮单击事件中打开新的Winform。 我在这里不知道到底是因为登录表单窗口从菜单按钮点击事件,存在各种形式的 请帮助me.Thanks提前到来其中窗户打开..如何关闭打开的窗体并在按钮上点击打开新窗体
回答
试试这个
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。
您可以在Application.OpenForms
收集和迭代关闭你需要的。使用for
循环
foreach (Form f in Application.OpenForms)
{
f.Close();
}
OR:
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
Application.OpenForms[i].Close();
}
OR创建表单列表:
您无法使用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();
}
}
这应该可以帮助您解决问题... ...诚然,这是不是最好的方法......这一切都取决于你的方法。如果你的要求更详细,我可以想出更好的方法。
'这是因为foreach不能用来改变枚举窗体列表(当你关闭它们的时候,你会得到一个运行时错误)?试试我的代码。 –
切勿在UI线程中使用'Thread.Sleep'。 – Dmitry
@Raging Bull:我没有说它不能完成......只是之前编写的代码不起作用。它会给出一个InvalidOperation异常,因为“集合已被修改,枚举操作可能不会执行” 。你的代码更复杂。您将所有表单添加到列表中,然后关闭它们。相反,只需执行for循环并在一次操作中关闭它们即可。 –
在你的登录表单,使默认的构造函数私有,并添加一个新的构造和这样一个私有成员:
private Form _callerform;
private LoginForm()
{
InitializeComponent();
}
public LoginForm(Form caller)
{
InitializeComponent();
}
现在,在按钮上LoginForm的单击事件,尝试这样的事情:
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();
}
}
- 1. 关闭模式窗体并在点击按钮时打开一个新窗口
- 2. 如何在CF7中点击按钮时打开新窗体?
- 3. 如何在窗体上打开新窗口关闭?
- 4. 使用javascript在打开新窗体之前关闭所有打开的窗体
- 5. 从窗体窗口点击按钮时打开WPF窗口
- 6. C#中打开窗体并关闭它
- 7. FancyBox正在关闭窗体焦点并重新打开窗体内容
- 8. 按钮点击不打开新窗口
- 9. WPF:点击按钮打开新窗口
- 10. 打开下一个窗体上的按钮点击问题
- 11. 关闭一个窗体并打开另一个窗体
- 12. vb.net关闭多个窗体并打开另一个窗体
- 13. 打开一个新窗体,关闭旧窗体C#
- 14. 提交按钮打开新窗口并关闭父窗口?
- 15. 单击按钮,打开窗体,关闭窗体,然后在父窗体中执行某些操作
- 16. 在按钮上打开同一窗体中的文本窗口点击
- 17. 当窗体加载时,打开窗体2并关闭窗体1
- 18. 如何在odoo10中点击打开新窗体的按钮来解决错误?
- 19. 关闭MessageBox但保持窗体打开
- 20. 重新加载Windows窗体而不关闭并重新打开
- 21. 带按钮的打开窗体
- 22. 关闭一个子窗体并打开另一个窗体,单击C#.net中的用户控件按钮。
- 23. 关闭现有的窗体打开另一个窗体
- 24. 如何在php中动态按钮点击事件打开新窗体
- 25. 如何在x按钮(最右上角)被点击时保持窗体打开?
- 26. 如何打开一个窗口并关闭另一个按钮点击
- 27. 以ShowDialog形式打开窗体但关闭窗体
- 28. 打开一个静态窗体/ jFrame点击按钮
- 29. 单击Java窗体上的按钮打开本地文件
- 30. 爪哇Swing打开窗体上的按钮单击
你似乎已经知道该怎么做。你卡在哪里?添加一个按钮?创建新表单的实例?当您关闭登录表单时,程序是否结束? –
@GrantWinney我不知道确切地打开了哪些窗口,因为登录表单窗口来自每个表单上的菜单按钮单击事件 – Ram
为什么有人点击菜单项以显示登录表单?当用户启动程序时,你不想一次性显示登录表单吗? –