2016-07-28 8 views
1

Ich versuche, Funktionalität zu implementieren, damit der Benutzer seine bevorzugten Formulare auswählen kann. Bevorzugte Formulare sind Formulare, auf die er/sie schnell zugreifen kann. Um zu vermeiden, dass Sie zu lange durch die ToolStripMenus suchen.Wie speichere ich Objekte in der Winforms-Anwendung?

Ich versuche, einen Verweis auf ein Formular in der Anwendungskonfiguration zu speichern. Aber ich erhalte die Störung

Werte vom Typ ‚System.Windows.Forms.Form‘ kann nicht auf ‚String‘ umgewandelt werden.

Public Sub SetSetting(ByVal pstrKey As String, ByVal frmFavorite As Form) 
    Dim keyExists As Boolean = False 
    For Each strKey As String In configuration.AppSettings.Settings.AllKeys 
     If strKey.Equals(pstrKey) Then 
      configuration.AppSettings.Settings.Item(pstrKey).Value = frmFavorite 
      keyExists = True 
     End If 
    Next 

    If Not keyExists Then 
     configuration.AppSettings.Settings.Add(pstrKey, frmFavorite) 
    End If 
    configuration.Save(ConfigurationSaveMode.Modified) 
    ConfigurationManager.RefreshSection("appSettings") 
End Sub 
+0

Sie sollten stattdessen den Namen des Formulars speichern. Das Speichern des ganzen Formulars ist nicht gut, besonders nicht, wenn Sie es in der Zukunft ändern. In [diese Frage] (http://stackoverflow.com/questions/26478165/calling-a-separate-windows-form-using-its-name-as-a-string) erfahren Sie, wie Sie ein Formular über seinen Namen öffnen können . ** HINWEIS: ** Es erstellt eine neue Instanz des Formulars, dh es kann nicht mit der Standardinstanz geändert werden. –

+0

Das Problem mit dem Speichern seines Namens ist, dass ich seine Parameter, die wieder Objekte sind, speichern muss. Und es ist kein Problem, wenn es eine neue Instanz erstellt. – SamekaTV

+0

Hmm ... Dann scheint es besser, das gesamte Formular zu speichern. Sie könnten es zu einer Base64-Zeichenfolge serialisieren. [Siehe diese Antwort] (http://stackoverflow.com/a/2861749/3740093). –

Antwort

1

können Sie speichern nur string Werte in Konfigurationsdatei der Anwendung, keine Objekte.
Aber speichern Sie einfach den Namen des Formulars in der Konfigurationsdatei. Wenn Sie Ihre Anwendung starten, erstellen Sie das Formular über eine Reflektion wie in this Object Factory Beispiel gezeigt.

Public Class ObjectFactory 

    Public Shared Function CreateAnObject(ByVal ObjectName As String) As Object 
     Dim Assem = [Assembly].GetExecutingAssembly() 

     Dim myType As Type = Assem.GetType(ObjectName.Trim) 
     Dim o As Object = Nothing 
     Try 
      o = Activator.CreateInstance(myType) 
     Catch oEx As TargetInvocationException 
      MessageBox.Show(oEx.ToString) 
     End Try 

     Return o 
    End Function 
End Class 

...

Dim formName as String = configuration.AppSettings.Settings.Item(<YourSettingKey>) 

Dim oForm As Form = _ 
     ObjectFactory.CreateAnObject(formName) 
+0

Was ist mit einer Form mit Parametern, die Objekte sind? – SamekaTV

+0

Sie sprechen über Konstruktorparameter des Formulars wie 'new Form (o1, o2, ...)'? –

+0

Ja, das ist genau das, was ich meine – SamekaTV

Verwandte Themen