vb.net My.Settings

3.6k views Asked by At

Is there a way to create my.settings variables dynamically? I want to generate my.settings variables depending on values in my data base so the number my.settings variables need to vary from time to time.

If i had the following values in my database,

0
2
6
13
77

the names of my.settings variables generated will be

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

So I want to create those variables on the applications first run. Question after getting the numbers from the Database. How to i create those variables with code?

Also is there a way to remove them with code Because when the values of the database changes and the value does not exist, I then need to remove its variable?

Also i would like some suggestions, If this isn't in a good way.

1

There are 1 answers

1
Mike Guthrie On BEST ANSWER

Project Settings don't seem to do well with serializing and saving values beyond the basic types. What you can do is use a User-scoped string-valued setting to store a serialized Dictionary.

For my example, I created a setting named SerializedKeyPercentDictionary of Type string and Scope User. I am using JSON for my serialization, as it creates a string of smaller length than most other serializations. For this, you will need to add a reference to System.Runtime.Serializations. With this setting and that reference in place, you can then make a global helper class to provide a strongly-typed dictionary for managing your key-to-percent mapping:

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