【问题标题】:vb.net My.Settingsvb.net 我的设置
【发布时间】:2012-08-01 17:48:06
【问题描述】:

有没有办法动态创建my.settings 变量? 我想根据数据库中的值生成 my.settings 变量,因此 my.settings 变量的数量需要不时变化。

如果我的数据库中有以下值,

0
2
6
13
77

生成的 my.settings 变量的名称将是

My.Settings.M0
My.Settings.M2
My.Settings.M6
My.Settings.M13
My.Settings.M77

所以我想在应用程序首次运行时创建这些变量。 从数据库中获取数字后的问题。如何使用代码创建这些变量?

还有没有办法用代码删除它们因为当数据库的值发生变化并且值不存在时,我需要删除它的变量?

我也想要一些建议,如果这不是一个好方法。

【问题讨论】:

  • 由于您在实际编写代码时无法引用运行时生成的属性,您想要这样做的原因是什么?我看不出有什么收获。看起来您可能可以重新设计您的流程以仅使用列表或字典。
  • 每个数字都有一个与之相关的百分比,我使用这个百分比在存在特定数字的行中进行一些计算,例如值 2 可能存在于 33000 条记录中,有时这个百分比会发生变化因此用户应该能够从文本框中对其进行编辑,因此 my.settings 变量将用于存储可从文本框中编辑的百分比
  • 文本框也会根据我有多少不同的数字而动态生成
  • 我会说你最好把这样的逻辑放到Dictionary(Of Int, Decimal)中。如果您仅将 My.Settings 用于公共共享对象,请在静态帮助程序类中创建您的字典。
  • 当用户再次运行应用程序时,它会保存用户对百分比所做的更改?

标签: vb.net my.settings


【解决方案1】:

项目设置似乎在序列化和保存基本类型之外的值方面做得不好。您可以做的是使用用户范围的字符串值设置来存储序列化字典。

对于我的示例,我创建了一个名为 SerializedKeyPercentDictionary 的设置,类型为 string 和范围 User。我使用 JSON 进行序列化,因为它创建的字符串比大多数其他序列化的长度更短。为此,您需要添加对 System.Runtime.Serializations 的引用。有了这个设置和那个引用,你就可以创建一个全局帮助类来提供一个强类型的字典来管理你的键到百分比的映射:

Public Class KeyPercentHelper
    Private Shared _keyPercentDictionary As Dictionary(Of Integer, Decimal)
    Private Shared _initLock As Object = New Object()

    Public Shared ReadOnly Property KeyPercentDictionary As Dictionary(Of Integer, Decimal)
        Get
            If (_keyPercentDictionary Is Nothing) Then
                InitializeDictionary()
            End If
            Return _keyPercentDictionary
        End Get
    End Property

    Shared Sub New()
        AddHandler My.Settings.SettingsLoaded, AddressOf HandleSettingsLoad
        AddHandler My.Settings.SettingsSaving, AddressOf HandleSettingsSaving
    End Sub

    Private Shared Sub InitializeDictionary()
        ' Load dictionary from User Setting.
        SyncLock _initLock
            If (_keyPercentDictionary Is Nothing) Then
                If (String.IsNullOrEmpty(My.Settings.SerializedKeyPercentDictionary)) Then
                    _keyPercentDictionary = New Dictionary(Of Integer, Decimal)()
                Else
                    Dim ser As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Dictionary(Of Integer, Decimal)))
                    Using memStream As New System.IO.MemoryStream()
                        Using writer As New System.IO.StreamWriter(memStream)
                            writer.Write(My.Settings.SerializedKeyPercentDictionary)
                            writer.Flush()
                            memStream.Position = 0
                            _keyPercentDictionary = CType(ser.ReadObject(memStream), Dictionary(Of Integer, Decimal))
                        End Using
                    End Using
                End If
            End If
        End SyncLock
    End Sub

    Private Shared Sub HandleSettingsLoad(ByVal sender As Object, ByVal e As EventArgs)
        If (_keyPercentDictionary Is Nothing) Then
            InitializeDictionary()
        End If
    End Sub

    Private Shared Sub HandleSettingsSaving(ByVal sender As Object, ByVal e As EventArgs)
        ' Ensure User Setting value is updated before save.
        Dim ser As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Dictionary(Of Integer, Decimal)))
        Using memStream As New System.IO.MemoryStream()
            ser.WriteObject(memStream, _keyPercentDictionary)
            memStream.Position = 0
            Using reader As New System.IO.StreamReader(memStream)
                My.Settings.SerializedKeyPercentDictionary = reader.ReadToEnd()
            End Using
        End Using
    End Sub
End Class

【讨论】:

  • 这很棒而且效果很好。仅供参考,您需要添加对 System.ServiceModel.Web 的引用才能访问 System.Runtime.Serialization.Json。谢谢!
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多