我目前有兩個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
爲什麼有人點擊菜單項以顯示登錄表單?當用戶啓動程序時,你不想一次性顯示登錄表單嗎? –