2012-06-21 54 views
3

創建一個登錄表單,如果憑據正確,將會繼續到主表單。這裏是基本的僞代碼:如何創建winform登錄對話框並保持循環

ShowLoginForm() 

if (DialogResult == OK) 
    CheckCredentials(); 
    if (credentials == VALID) 
    ShowMainForm(); 
    else 
    LoopBackAndShowLoginFormAgain(); //repeat process... 
else 
    CloseLoginForm(); 

但是,我對WinForms相對比較陌生,並且還在搞清楚。我試圖決定把我的循環放在哪裏(Main()或LoginForm中的某個地方)。我應該在哪裏進行憑證檢查?這是我到目前爲止有:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    LoginForm loginForm = new LoginForm(); 
    if (loginForm.ShowDialog() == DialogResult.OK) 
    { 
     Application.Run(new AutoSignerForm()); 
    } 
} 

我不想退出,並多次打開了一個登錄表單(在尋找一些效率這裏,所以我想用相同的登錄對話框)。任何指針,提示或想法?

+1

而不是顯示一個新的表單,如果登錄失敗,那麼處理提交按鈕處理程序中的邏輯呢?如果憑證未檢出,請清除用戶名/密碼字段,並且不要關閉表單。 – itsme86

+0

這也是我的想法。我不知道如何防止關閉窗體並將dialogResult返回給Main。 – keelerjr12

回答

13

我會做到以下幾點:

  • 在Program.cs中

    顯示登錄表單作爲對話框

    LoginForm login_form = new LoginForm(); 
    if(login_form.ShowDialog() == DialogResult.OK) { 
        Application.Run(new MainForm()); 
    } 
    
  • 在一個LoginDialog

    ,處理click 「登錄」按鈕上的事件(或任何名稱)

    現在10
    // replace with the actual login 
    if(textBoxUsername.Text == "my user" && textBoxPassword.Text == "my pass") { 
        // save the user has logged in somewhere 
        // set the dialog result to ok 
        this.DialogResult = DialogResult.OK; 
        // close the dialog 
        this.Close(); 
    } else { 
        // login failed 
        MessageBox.show("Login failed"); 
        // do not close the window 
    } 
    

,你能不能讓出的LoginDialog裏,直到用戶輸入有效的憑據,就放棄嘗試和應用程序關閉。這樣你將只有一個LoginForm實例,這將是一個不錯的用戶體驗。 此外,您可以確保沒有用戶登錄成功,MainForm未初始化並顯示。

+0

這是我的同一個確切的想法,但是,我無法得到它的工作。我不確定如何阻止表單關閉。用您的代碼顯示MessageBox,然後窗體關閉,然後顯示主窗體。 – keelerjr12

+0

您可能已使用DialogResult.OK設置了「LoginButton」。您應該將其保留爲DialogResult.None(默認屬性),並且您也可以不將其設置爲表單的「AcceptButton」。你能檢查一下,然後再試一次嗎? –

+0

是的,這是問題,謝謝! – keelerjr12

1

爲什麼不創建主窗體,然後顯示登錄模式對話框。然後你可以檢查要做什麼。

+0

顯示更改我的Main以顯示Application.Run(新的AutoSignerForm()),然後在Form_Load()中調出一個loginDialog? – keelerjr12

2

試試這個

LoginForm loginForm = new LoginForm();  
do { 
    if (loginForm.ShowDialog() == DialogResult.Cancel) { 
     return; // Ends application 
    } 
} while (CheckCredentials() != VALID) 
Application.Run(new AutoSignerForm()); 
+0

直到用戶想要單擊登錄表單上的取消按鈕爲止。我想使它相對乾淨,並且沒有一堆布爾值來進行檢查。 – keelerjr12

+0

我改變了我的例子。 –

+0

謝謝,所以你推薦檢查Main中的憑據而不是實際的loginForm? – keelerjr12

0

如何在SubmitButton事件處理程序中將DialogResult設置爲None?例如:

private void loginButton_Click(object sender, EventArgs e) 
{ 
    if (isValidCredentials()) 
     DialogResult = DialogResult.OK; 
    else 
    { 
     MessageBox.Show("Failed to login or some other error"); 
     DialogResult = DialogResult.None; 
    } 
} 
+0

我會改變它'if(isValidCredentials()){DialogResult = DialogResult.OK; Close()} else {messageLabel.Visible = true; firstTextBox.Focus(); }'。在第二種情況下,不需要對話結果,因爲對話框格式保持打開狀態。只有在'cancelButton_Click'中做'DialogResult = DialogResult.Cancel;關閉();' –

+0

我做了更改,但由於某種原因,當我沒有在第二種情況下設置DialogResult = DialogResult.None時,它會關閉我的表單。我沒有把它放在其他地方。 – keelerjr12

+0

可能這會自動發生,因爲'loginButton'是窗體的默認接受按鈕。在這種情況下,請將它設置爲「無」。 –