【问题标题】:How do I save objects in Configuration of Winforms application?如何在 Winforms 应用程序的配置中保存对象?
【发布时间】:2016-07-28 07:25:22
【问题描述】:

我正在尝试实现允许用户选择他最喜欢的表单的功能。最喜欢的表格是他/她需要快速访问的表格。为了避免浏览 ToolStripMenu 的时间过长。

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

“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

【问题讨论】:

  • 您应该保存表单的名称。保存整个表单并不好,特别是如果您将来更改它。请参阅this question,了解如何按名称打开表单。 注意: 它会创建一个新的表单实例,这意味着它不能通过使用它的默认实例来修改。
  • 保存它的名字的问题是我必须保存它的参数,这些参数又是对象。如果它创建一个新实例,这不是问题。
  • 嗯...那么保存整个表单似乎更好。您可以将其序列化为 base64 字符串。 See this answer.
  • 是的(回答已删除的评论),使用二进制序列化您将能够序列化整个表单及其所有内容。通过将其序列化为内存流,您可以将其作为字节数组获取,该数组可以转换为 Base64 字符串。
  • @ISeeSharp 不要考虑序列化整个表单。这没有意义。将对您很重要的属性绑定到设置就足够了。这样,当您加载每个表单时,这些属性将从设置中加载。

标签: vb.net winforms configuration


【解决方案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)

【讨论】:

  • 带有对象参数的表单怎么样?
  • 你说的是new Form(o1, o2, ...)这样形式的构造函数参数?
  • 是的,我就是这个意思
  • 在这种情况下,我建议Serialize/Deserialize 整个表单对象。
猜你喜欢
  • 2011-04-21
  • 2015-06-08
  • 2011-03-03
  • 2010-11-14
  • 2021-04-07
  • 1970-01-01
  • 2013-04-06
  • 2014-03-22
  • 1970-01-01
相关资源
最近更新 更多