![](/img/trans.png)
[英]c# - How to close the main form without letting the application close?
[英]How can I close a login form and show the main form without my application closing?
我的項目中有兩個 forms(Login 和 Main)。
我想要完成的是,如果登錄成功,我必須顯示主窗體並關閉登錄窗體。
我在登錄表單中有這個方法,當登錄成功時關閉登錄表單。 但是主窗體不顯示。
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
var main = new Main();
main.Show();
this.Close();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
如果登錄過程成功,我嘗試隱藏登錄表單。 但這讓我很困擾,因為我知道當我的程序運行時登錄表單也仍然存在,它應該關閉,對嗎?
正確的方法應該是什么? 謝謝...
無法顯示主表單的原因是因為一旦關閉登錄表單,應用程序的消息泵就會關閉,這將導致整個應用程序退出。 Windows消息循環與登錄表單相關聯,因為這是您在項目屬性中設置為啟動表單的表單。 查看“ Program.cs”文件,您將看到負責的代碼: Application.Run(new LoginForm())
。 在MSDN上查看有關該方法的文檔,這將對此進行更詳細的說明。
最好的解決方案是將代碼從登錄表單中移出到“ Program.cs”文件中。 程序首次啟動時,您將創建並以模式對話框形式顯示登錄表單(該對話框在單獨的消息循環上運行,並阻止其余代碼的執行,直到關閉為止)。 登錄對話框關閉后,您將檢查其DialogResult
屬性以查看登錄是否成功。 如果是這樣,則可以使用Application.Run
啟動主窗體(從而創建主消息循環)。 否則,您可以退出應用程序而無需顯示任何形式。 像這樣:
static void Main()
{
LoginForm fLogin = new LoginForm();
if (fLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new MainForm());
}
else
{
Application.Exit();
}
}
我會反過來做。
在您的Main窗體的OnLoad事件中,將Logon窗體顯示為對話框。 如果對話框結果確定,則允許Main繼續加載,如果結果是身份驗證失敗,則中止加載並顯示消息框。
編輯代碼示例
private void MainForm_Load(object sender, EventArgs e)
{
this.Hide();
LogonForm logon = new LogonForm();
if (logon.ShowDialog() != DialogResult.OK)
{
//Handle authentication failures as necessary, for example:
Application.Exit();
}
else
{
this.Show();
}
}
另一個解決方案是從program.cs中的Main方法顯示LogonForm,如下所示:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LogonForm logon = new LogonForm();
Application.Run(logon);
if (logon.LogonSuccessful)
{
Application.Run(new MainForm());
}
}
在此示例中,您的LogonForm必須公開一個LogonSuccessful bool屬性,該屬性在用戶輸入有效憑據時設置為true
這很簡單。
這是代碼。
private void button1_Click(object sender, EventArgs e)
{
//creating instance of main form
MainForm mainForm = new MainForm();
// creating event handler to catch the main form closed event
// this will fire when mainForm closed
mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed);
//showing the main form
mainForm.Show();
//hiding the current form
this.Hide();
}
// this is the method block executes when main form is closed
void mainForm_FormClosed(object sender, FormClosedEventArgs e)
{
// here you can do anything
// we will close the application
Application.Exit();
}
這是我的解決方案。 創建ApplicationContext來設置應用程序的主窗體,並在您要打開新窗體和關閉當前窗體時更改主窗體。
static class Program
{
static ApplicationContext MainContext = new ApplicationContext();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainContext.MainForm = new Authenticate();
Application.Run(MainContext);
}
public static void SetMainForm(Form MainForm)
{
MainContext.MainForm = MainForm;
}
public static void ShowMainForm()
{
MainContext.MainForm.Show();
}
}
登錄過程完成后。
private void BtLogin_Click(object sender, EventArgs e)
{
//Login Process Here.
Program.SetMainForm(new Portal());
Program.ShowMainForm();
this.Close();
}
我希望這能幫到您。
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login();
}
private static bool logOut;
private static void Login()
{
LoginForm login = new LoginForm();
MainForm main = new MainForm();
main.FormClosed += new FormClosedEventHandler(main_FormClosed);
if (login.ShowDialog(main) == DialogResult.OK)
{
Application.Run(main);
if (logOut)
Login();
}
else
Application.Exit();
}
static void main_FormClosed(object sender, FormClosedEventArgs e)
{
logOut= (sender as MainForm).logOut;
}
}
public partial class MainForm : Form
{
private void btnLogout_ItemClick(object sender, ItemClickEventArgs e)
{
//timer1.Stop();
this.logOut= true;
this.Close();
}
}
這是最優雅的解決方案。
private void buttonLogin_Click(object sender, EventArgs e)
{
MainForm mainForm = new MainForm();
this.Hide();
mainForm.ShowDialog();
this.Close();
}
;-)
這是一個簡單的解決方案,您的問題是,當您關閉登錄表單時,整個應用程序也會關閉嗎? 如果是這樣, 請轉到項目屬性 ,然后在“應用程序”選項卡上將關閉模式更改為“當最后一個表單關閉時” ,這樣就可以使用Me.close而不關閉整個程序
埃文(Evan)的帖子太舊了,如果您想顯示啟動畫面/登錄屏幕,並且當啟動畫面的進度條獲得特定值/或者成功登錄並關閉啟動畫面/登錄,然后重新顯示,我想給您一個竅門主要形式,frm-main將是啟動形式,而不是frm-spalash
在frm-main
public partial class frmMain : Form
{
public frmMain()
{
frmSplash frm = new frmSplash();
frm.Show(); // new splash screen will shows
this.Opacity=0; // will hide your main form
InitializeComponent();
}
}
在frm-飛濺
private void timer1_Tick(object sender, EventArgs e)
{
int cnt = progressBar1.Value;
switch (cnt)
{
case 0:
//Do sum stuff
break;
case 100:
this.Close(); //close the frm-splash
frmMain.ActiveForm.Opacity = 100; // show the frm-main
break;
}
progressBar1.Value = progressBar1.Value+1;
}
如果用於登錄表單
private void btlogin_Click(object sender, EventArgs e)
{
bool login = false;
//try your login here
//connect your database or whatever
//and then when it success update login variable as true
if(login == true){
this.Close(); //close the frm-login
frmMain.ActiveForm.Opacity = 100; // show the frm-main
}else{
//inform user about failed login
}
}
請注意,我使用計時器和進度條來操作您不需要這兩個動作的動作,僅是為了完整回答,希望這對您有所幫助
您應該反過來做:
首先加載主mainform
並在其onload
事件中使用showdialog()
顯示您的loginform
,這將阻止mainform
顯示,直到您從loginform
獲得結果loginform
編輯 :這是一個登錄表單,如果你不從你需要的任何變量mainform
( 這是在實踐中不好的設計 ),你應該實現它在你的Program.cs作為達維德和科迪建議。
我認為更好的方法是在通常具有Application.Run(form1)的Program.cs文件中執行此操作,以這種方式獲得更簡潔的方法,Login表單不需要與Main表單耦合,您只需顯示登錄名,如果返回true,則顯示主表單,否則顯示錯誤。
嘗試這個:
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
this.Close();
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Main));
t.Start();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
[STAThread]
public void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
如果我沒有記錯的話,由於Windows的API和COM接口的調用系統,您必須在不同的線程單元中調用新表單。
一個建議:該系統是高度不安全的,因為您可以更改if條件(在MSIL中),並且它是“孩子游戲”以傳遞安全性。 您需要一個功能更強大的系統來保護軟件,例如混淆或遠程登錄或類似的東西。
希望這可以幫助。
public void ShowMain()
{
if(auth()) // a method that returns true when the user exists.
{
this.Hide();
var main = new Main();
main.Show();
}
else
{
MessageBox.Show("Invalid login details.");
}
}
在成功登錄之前顯示登錄並關閉登錄表單的最佳方法是將登錄表單放在InitializeComponent之后的FrmMain中。
public FrmMain()
{
FrmSplash FrmSplash = new FrmSplash();
FrmSplash.ShowDialog();
InitializeComponent();
//Login Section
{
嘗試這個
private void cmdLogin_Click(object sender, EventArgs e)
{
if (txtUserName.Text == "admin" || txtPassword.Text == "1")
{
FrmMDI mdi = new FrmMDI();
mdi.Show();
this.Hide();
}
else {
MessageBox.Show("Incorrect Credentials", "Library Management System", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
當您退出應用程序時,您可以使用
Application.Exit();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.