2016-07-28 43 views
1

我试图实现功能,以允许用户选择他最喜欢的形式。最喜欢的表格是他/她需要快速访问的表单。通过ToolStripMenu来避免浏览太久。如何在Winforms应用程序的配置中保存对象?

我尝试在应用程序配置中保存对表单的引用。但我得到的错误

值类型“System.Windows.Forms.Form中”不能被转换为 字符串“”。

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

您应该保存表单的名称来代替。保存整个表格并不好,尤其是如果您将来改变它的话。查看[这个问题](http://stackoverflow.com/questions/26478165/calling-a-separate-windows-form-using-its-name-as-a-string)了解如何通过名称打开表单。 **注意:**它会创建一个新的窗体实例,这意味着它不能通过使用其默认实例进行修改。 –

+0

保存其名称的问题是我必须保存它的参数,这些参数又是对象。如果它创建一个新的实例,这不是一个问题。 – SamekaTV

+0

嗯...那么保存整个表单似乎更好。你可以将它序列化为一个base64字符串。 [看到这个答案](http://stackoverflow.com/a/2861749/3740093)。 –

回答

1

只能存储在应用程序配置文件string值,没有对象。
但只是在配置文件中存储表单的名称。 开始创建应用程序时,请通过反射来创建表单,如this Object Factory示例中所示。

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

如何使用参数作为对象? – SamekaTV

+0

你正在谈论窗体的构造函数参数,比如'new Form(o1,o2,...)'? –

+0

是的,这正是我的意思 – SamekaTV

相关问题