2009-07-14 11 views
0

Ich habe ein .NET CF-Programm (auf einem Smartphone) und ich habe eine Optionsseite dafür geschrieben.Lazy Load Forms

Auf der Optionen Seite habe ich Links zu 6 anderen Formen, die die tatsächlichen Optionen enthalten. Wenn das Hauptformular geladen wird, erstellt es die 6 Unterformulare und speichert sie in einer Liste, die zum Starten bereitsteht. Das Problem dabei ist die anfängliche Erstellungszeit, die zum Erstellen dieser Formulare erforderlich ist, wodurch die Haupteinstellungen langsam werden.

Was ich im Idealfall möchte, ist eine Möglichkeit, nur den Typ und die Parameter anzugeben, die zum Erstellen des Unterformulars beim Laden erforderlich sind, und dann das Formular bei Bedarf zu erstellen.

Hier ist Code-Schnipsel, wie es funktioniert zur Zeit:

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()); 

Das Formular wird im Tag-Abschnitt einer Liste (welche die Optionen Unter zeigt) gespeichert

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

Wenn eine Option gedrückt wird, wird folgende Funktion aufgerufen, um das Formular

zu starten

Ich bin sicher, es gibt eine ziemlich einfache Möglichkeit, dies zu tun, ich kämpfe nur mit dem richtigen Weg. Dank

Antwort

2

Sie können es auf diese Weise tun:

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(); 
     } 
    } 
} 

Wenn Sie C# 2.0 verwenden, können Sie

delegate { return new General(); } 

statt

()=> new General(); 
+0

Dank, die sich wie ein verwenden müssen, sieht gute Möglichkeit; Ich kann es noch nicht funktionieren, aber ich bekomme den Fehler: "Nur Zuweisung, Aufruf, Inkrement, Dekrement und neue Objektausdrücke können als eine Anweisung verwendet werden" (Func) – Chris

+0

Scheint zu funktionieren ohne (Func

) - danke – Chris

+0

Ich habe das von Grund auf ohne kompilieren geschrieben. Ich entfernte (Func ) von der Antwort. – TcKs

Verwandte Themen