2013-02-13 62 views
2

在窗體的負載,我需要做的X量檢驗的,以確定是否要打開或關閉的形式。以下是一個簡單的例子。繼承的Windows窗體奇怪的行爲

public partial class BaseForm : Form 
{ 
    private void BaseForm_Load(object sender, EventArgs e) 
    { 
    if(!IsUserValid()) 
     MessageBox.Show("User is not valid"); 
    } 
    private bool IsUserValid() 
    { 
    List<string> allowedUsernames = new List<string>(); 
    using (SqlConnection con = new SqlConnection(_connectionString)) 
    { 
     //Get a list of usernames, none of which are "Developer" usernames 
    } 
    return allowedUsernames.Any(username => username == Environment.UserName); 
    } 
} 
public partial class DerivedForm : BaseForm 
{ 

} 

上面的例子中,我可以在設計器中完美加載表單,而不管我的用戶名是什麼。如果我做的另一種形式,DerivedForm和繼承的基礎然後調用Load,因此會表現出MessageBox然後Close在設計模式的形式,不給我訪問設計師,爲什麼派生WindowsForm需要使用Load事件但基地不?如果你正在做WindowsForms的繼承,那麼明智的做法是不使用Load事件?

我只是認爲這是奇怪的,任何人都知道嗎?

+0

我沒有看到'override'。你在哪裏掛載負載事件? – 2013-02-13 15:03:24

+0

@ P.Brian.Mackey沒有一個'override'只是直接繼承衍生的基地。 – LukeHennerley 2013-02-13 15:06:06

+1

考慮從UI分離業務邏輯。表單不應該包含名爲'IsUserValid'的方法 - 將其移動到引擎類並在其上調用它,然後根據結果決定是否創建(並顯示)表單。 – 2013-02-13 15:11:31

回答

1

還有一個question它解決了類似的問題。另外,接受的答案給出瞭解決此問題的解決方案:https://stackoverflow.com/a/2427420/674700

基本上,你的情況,添加DesignTimeHelper類,只是使用以下修改看出區別:

private void BaseForm_Load(object sender, EventArgs e) 
{ 
    if (!DesignTimeHelper.IsInDesignMode) 
    { 
     if (!IsUserValid()) 
     { 
      MessageBox.Show("User is not valid"); 
     } 
    } 
    else 
    { 
     MessageBox.Show("Called from VS"); 
    } 
}