2014-05-16 32 views
1

我的dialogForm出現問題。這是我的mainForm開始運行時打開dialogForm(這是一個登錄表單)的代碼。C#DialogForm在調用mainForm時打開

private void indexForm_Load(object sender, EventArgs e) 
    { 
     startForm loginForm = new startForm(); 
     loginForm.ShowDialog(); 
     indexUsername.Text = klasseGebruikersnaam.gebruikersnaam;   
    } 

因此,當我的indexForm(主窗體)啓動時,它首先加載一個dialogForm,這是我的登錄窗體。

現在我的問題是,每當我嘗試使用此代碼另一種形式的存取權限MainForm的(例如,當我點擊一個按鈕):

 this.Hide(); 
     indexForm inf = new indexForm(); 
     inf.Show(); 

的dialogForm再次彈出。所以我想顯示我的mainForm,但是,當我加載我的mainForm時,我的dialogForm總是彈出。

任何方法?

在此先感謝。

+0

上面的代碼有問題。如果indexForm是您的主窗體,調用new indexForm將創建indexForm的新實例,請勿將此實例與初始Application.Run創建的實例混淆。他們是同一類型的兩個不同的變量,但不是相同的實例 – Steve

回答

2

的問題是,你是從你的主加載你loginForm窗體的載入事件。在調用Main Form的構造函數之後,它總是會觸發。通常情況下,您需要在之前從的某處啓動loginForm,然後加載主窗體。您可以在Program.cs文件中執行此操作,並使其成爲該程序的主要入口點。或者只是簡單的檢查,如果用戶已經登錄

這裏既是一個例子:

Program.cs的

static void Main() 
{ 
    //Auto-generated code that VS writes for you 

    using (var loginForm = new LoginForm()) 
    { 
     if (loginForm.ShowDialog() == DialogResult.Yes) //Presumably it would only return Yes if the login was successful. 
     { 
      Application.Run(new MainForm()); //Or however you call your main form 
     } 
    } 
} 

你可以只是把財產的主要形式確定用戶是否已登錄。然後,您仍然可以在Load事件中調用它。

Load事件

if(!this.UserLoggedIn) 
{ 
    loginForm.ShowDialog(); 
    //Do something with the dialog result. 
} 

在我看來,最好是用戶Program.cs方法,因爲如果用戶沒有正確登錄,你可以退出,或根據需要,而不在加載主窗體處理它所有。您目前擁有它的方式,在登錄窗體顯示之前,主窗體必須加載,這可能會造成問題。

+0

不能完全得到program.cs方法的工作。您在新的MainForm中的「loginCredentials」實際上意味着什麼? – user3644837

+0

@ user3644837不要直接複製和粘貼,你可能不需要登錄憑證,這就是我將要做的事*將用戶角色等傳遞給主窗體,以防你爲不同的角色提供不同的版本等...我評論了這個例子,希望能更好地解釋一下。 –

+0

通常在OOP中,我們希望我們的類可以做*特定的*事情。所以你的所有登錄邏輯都應該在'loginForm'類中處理(或者更好的是一個分離的邏輯類來處理你的登錄表單將使用的身份驗證)。 –

0

看起來像你需要添加一個檢查,看看用戶是否登錄圍繞

loginForm.ShowDialog(); 

if(!UserLoggedIn()) 
{ 
    loginForm.ShowDialog(); 
} 
+0

所以我需要把這個檢查放在我的mainForm加載事件中嗎? – user3644837

+0

是的,請注意,UserLoggedIn方法是您需要放在一起的東西 – workabyte

1

那麼,你應該從主窗體中移除該代碼並在顯示主窗體之前調用它。
或者你可以簡單地設置,保持對登錄的用戶,如果該變量不是空的電流信息的全局變量,不要再打電話登錄表單

所以,supppose你登錄表單準備類型與loggedInUser的實例變量

public class LoggedinUser 
{ 
    public string NickName {get;set;} 
    public string UserRole {get; set;} 
    ... 
} 

然後在工具類(或索引中的形式),你可以有一個靜態變量

public static LoggedinUser currentOperator = null; 
你在

index_form你可以寫

if(GlobaClass.currentOperator == null) 
{ 
    using(startForm loginForm = new startForm()) 
    { 
     if(loginForm.ShowDialog() == DialogResult.OK) 
      GlobalClass.currentOperator = loginForm.LoggedUser; 
    } 
} 
+0

很好的例子,這是*很少*時間之一,全局變量是一個好主意;) –

+0

通常全局變量是危險的,但它們並不總是可以避免的(或避免它們很方便)。當全局變量表示應用程序生命週期所需的單個實體(或者其更改易於監控(登錄/註銷)時,那麼他們有機會 – Steve