如何将数组存储在 my.settings 中 vb.net

How can I store an array in my.settings in vb.net

我正在尝试将用户输入数组存储在 vb.net 中的 my.settings 变量中。我希望用户以 {1,2,3} 的形式输入一个数组,将其作为字符串存储在设置中,然后能够在以后使用设置值来创建一个新数组。代码将类似于:

Dim inputarray()
Dim outputarray()

inputarray=textbox1.text
my.settings.inputstoredarray.add(inputarray)

outputarray=my.settings.inputstoredarray
textbox2.text=outputarray(0)

'If the user types "{1,2,3}' in textbox1, textbox2 should show "1"

我已经尝试了多个版本,但似乎总是存在类型转换错误。我不明白为什么如果我硬编码它会起作用:

inputarray={1,2,3}

但下面的代码不起作用:

inputarray=my.settings.inputstoredarray

如何在 my.settings 中存储用户提供的数组并检索它供以后使用?

即使我进入设置并将设置的字符串值设置为 {1,2,3}

也不起作用

您不能在应用程序设置中存储数组。您可以做的是创建类型 StringCollection 的设置。然后,您可以在代码中将其用作 StringCollection,或者如果您确实需要数组,也可以在 StringCollection 和数组之间来回传输数据。

首先打开项目属性的 设置 页面并创建类型为 System.Collections.Specialized.StringCollection 的新设置。对于此示例,我将其命名为 MyStringCollection,但您应该为您的应用程序适当地命名。执行此操作时,请注意 Value 字段默认为空。这意味着默认设置为 Nothing。没关系,但这意味着您需要在第一次使用之前在代码中实际创建 collection object,例如

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If My.Settings.MyStringCollection Is Nothing Then
        My.Settings.MyStringCollection = New StringCollection
    End If

    'Use My.Settings.MyStringCollection here.
End Sub

或者,您可以强制设置 UI 为您创建 object。为此,select 该设置的 Value 字段并单击浏览 (...) 按钮。添加任意字符并单击 OK 按钮。请注意,Value 字段填充了包含您输入的文本的 XML 片段。再次单击浏览 (...) 按钮,删除文本并再次单击 确定。请注意 XML 仍然存在,即使您输入的文本已被删除。 XML 现在将自动创建 StringCollection object,因此您不需要代码来执行此操作。

如果您对 collection 的 String 值感到满意,那么您可以在任何您喜欢的地方直接在代码中使用该设置。在大多数情况下,它的工作原理类似于 List(Of String),允许您随意添加和删除项目。如果您特别需要一个数组或者您需要 String 以外的类型,那么您将不得不进行一些翻译,例如

'Load the collection items into a String array.
Dim myStringArray = My.Settings.MyStringCollection.Cast(Of String)().ToArray()

'Load the collection items into an Integer array.
Dim myIntegerArray = My.Settings.MyStringCollection.Cast(Of String)().Select(Function(s) CInt(s)).ToArray()

'Repopulate the collection from a String array.
My.Settings.MyStringCollection.Clear()
My.Settings.MyStringCollection.AddRange(myStringArray)

'Repopulate the collection from an Integer array.
My.Settings.MyStringCollection.Clear()
My.Settings.MyStringCollection.AddRange(myIntegerArray.Select(Function(n) n.ToString()).ToArray())

如果您想在 TextBox 中显示 collection 的内容,您可以这样做:

TextBox1.Text = String.Join(",", My.Settings.MyStringCollection.Cast(Of String)())

这将创建一个包含所有项目的 comma-delimited String。要从包含此类文本的 TextBox 重新填充 collection,请执行以下操作:

My.Settings.MyStringCollection.Clear()
My.Settings.MyStringCollection.AddRange(TextBox1.Text.Split(","c))

您可以在 Project properties/Settings 选项卡中浏览其他设置类型,但您会发现它相当有限,最常见的消息是您不能使用该类型。恐怕数组是你不能用的。

但是您可以使用完全支持的 StringCollection:

Dim saveTest As New StringCollection() From {"1", "2", "3", "4"}
My.Settings.MySetting = saveTest
My.Settings.Save()
Dim loadTest As StringCollection = My.Settings.MySetting

另一种选择是使用反序列化的 XML 或 JSON 字符串,但这有点复杂。

在“项目属性”的“设置”选项卡中设置您的设置,如下所示。

然后保存设置如下。

Private Sub SaveStringToSettings()
    My.Settings.StringOfInts = TextBox1.Text 'User types in {1, 2, 3}
End Sub

检索设置并将其转换为数组

Private Sub CreateArrayFromSettings()
    Dim SettingValue = My.Settings.StringOfInts
    Debug.Print(SettingValue) 'View this in the Immediate window
    'Get rid of the braces
    Dim TrimmedString = SettingValue.Trim({"{"c, "}"c})
    'Split the string by the commas into an array 
    Dim Splits = TrimmedString.Split(","c)
    'Get rid of the spaces
    For i = 0 To Splits.Length - 1
        Splits(i) = Splits(i).Trim
    Next
    TextBox1.Text = Splits(0) 'Displays 1
End Sub