2009-07-14 91 views
0

我有一個.NET CF程序(運行在智能手機上),我已經爲它寫了一個選項頁面。懶加載表格

在選項頁面上,我有6個包含實際選項的其他表單的鏈接。 當主窗體加載時,會創建6個子窗體並將它們存儲在準備啓動的列表中。與此相關的問題是創建這些表單所需的初始創建時間,這使得主要設置形式變得緩慢。

我理想中喜歡的一種方法是隻需指定在加載時創建子表單所需的類型和參數,然後在需要時實際創建表單。

這裏是它目前是如何工作的代碼片段:

Form_OnLoad():

AddSettingsOptions("General", new General()); 
AddSettingsOptions("Action Alert", new BaseAlertForm("Action Alert Settings", SystemManager.ActionAlert)); 
AddSettingsOptions("Comms Alert", new BaseAlertForm("Comms Alert Settings", SystemManager.CommsErrorAlert)); 
AddSettingsOptions("Advanced", new Advanced()); 
AddSettingsOptions("Diagnostics", new Diagnostics(_unitWatcher)); 
AddSettingsOptions("About", new About()); 

的形式存儲在一個列表的標籤部分(其中顯示了子選項)

private void AddSettingsOptions(String name, Form form) 
{ 
    listViewSettings.Items.Add(
     new ListViewItem(
      String.Format(" {0} {1}", listViewSettings.Items.Count + 1, name)) 
      { 
       Tag = form 
      } 
     ); 
} 

如果按下某個選項,將調用以下函數以啓動表格

private void ShowSubSetting(ListViewItem item) 
{ 
    if (item == null) 
     return; 

    object tag = item.Tag; 
    Form form = tag as Form; 
    if (form != null) 
    { 
     form.ShowDialog(); 
     //form.Dispose(); 
    } 
} 

我確定有一個非常簡單的方法來做到這一點,我只是正確的方式掙扎。 感謝

回答

2

你可以這樣來做:

AddSettingsOptions("General",()=> new General()); 
AddSettingsOptions("Action Alert",()=> new BaseAlertForm("Action Alert Settings", SystemManager.ActionAlert)); 
// etc ... 

void ShowSubSettings(ListViewItem item){ 
    if (null == item) { continue; } 

    object tag = item.Tag; 
    Func<Form> func = tag as Func<Form>; 
    if (null != func) { 
     Form frm = func(); 
     if (null != frm) { 
      frm.ShowDialog(); 
     } 
    } 
} 

如果您正在使用C#2.0中,你必須使用

delegate { return new General(); } 

,而不是

()=> new General(); 
+0

感謝,看起來像一個好辦法;雖然我不能讓它工作,但我得到錯誤:「只能使用賦值,調用,遞增,遞減和新的對象表達式作爲語句」在使用(Func

) – Chris 2009-07-14 13:01:23