2010-07-23 106 views
1

我正在進入事件處理階段,這對我來說似乎相當困惑。看,我來自網絡開發背景,所以這件事對我來說很新。激發自定義事件/一般事件處理

我在C#/ VS08中開發並在WinForm-Designer中創建了我的應用程序。

現在,我創建了這個程序概述;

ProgramContext 
MainForm : Form 
LoginForm : Form 

所以,我想要做的是,當用戶點擊「註銷」(什麼是MainForm中的MainMenu的菜單項),該應用程序將註銷用戶。

但如何我可以訪問註銷項目的「Click」事件從ProgramContext的觀點,因爲在等

我想記錄的所有的邏輯如下

MenuItem[] findLogout = MainMenuStrip.Items.Find("logoutMenuItem", true); // Throws NullPointerException 
findLogout[0].Click += new EventHandler(LogoutClick); 

private void LogoutClick(object sender, EventArgs e) 
{ 
// Logout user 
} 

但在第一行繼續收到NullPointerException。

+0

因此,您在哪裏得到前ception? – ULysses 2010-07-23 14:30:53

+0

示例'MenuItem [] findLogout ...'的第一行...' – 2010-07-23 14:32:47

+0

您可以驗證MainMenuStrip在調用點不爲空,且MainMenuString.Items在調用點不爲空且findLogout不是空的陣列?沒有上下文,這些似乎是NULL引用代碼中最薄弱的部分。 – 2010-07-23 14:33:13

回答

2

最簡單的辦法是暴露在MainForm的一個事件:

public EventHandler LogOut; 

然後掛接到這個從ProgramContext

MainForm form = new MainForm(); 
form.LogOut += new EventHandler(MainForm_LogOut); 

void MainForm_LogOut(object sender, EventArgs e) 
{ 
    // Logout 
} 

那麼火註銷按鈕是使用壓在MainMenu的以下代碼在菜單項的單擊事件中:

private void LogoutClick(object sender, EventArgs e) 
{ 
    if (LogOut != null) 
    { 
     LogOut(sender, e); 
    } 
} 
+0

@ApoY2k - 這是我個人使用的做法。比方說,例如,您將另一個註銷按鈕添加到您的MainForm,或者添加導致註銷的超時。您是否也希望將其傳達回程序上下文?使用當前的方法,您需要捕獲每個導致註銷的對象的事件。以我的例子來說,您只需在任何想要註銷的地方調用'LogOut(sender,e);'。 – GenericTypeTea 2010-07-23 14:50:51