0

我正在尝试将用户输入数组存储在 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} 也不起作用

4

3 回答 3

0

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

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

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 为您创建对象。为此,请选择该Value设置的字段并单击浏览 (...) 按钮。添加任意字符并单击“确定”按钮。请注意,该Value字段填充了一个 XML 片段,其中包含您输入的文本。再次单击浏览 (...) 按钮,删除文本并再次单击确定。请注意,即使删除了您输入的文本,XML 仍然存在。该 XML 现在将StringCollection自动创建对象,因此您不需要代码来执行此操作。

如果您对一组值感到满意,String那么您可以在任何您喜欢的地方直接在代码中使用该设置。在大多数情况下,它像 a 一样工作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())

如果您想在 a 中显示集合的内容,则TextBox可以执行以下操作:

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

String这将创建一个包含所有项目的单个逗号分隔的。要从TextBox包含此类文本的集合中重新填充集合,请执行以下操作:

My.Settings.MyStringCollection.Clear()
My.Settings.MyStringCollection.AddRange(TextBox1.Text.Split(","c))
于 2020-12-01T01:33:52.790 回答
0

您可以在项目属性/设置选项卡中浏览其他设置类型,但您会发现它相当有限,最常见的消息是您无法使用该类型。恐怕阵列是你不能使用的。

但是您可以使用完全支持的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 字符串,但这有点涉及。

于 2020-12-01T01:54:37.683 回答
0

在项目属性的设置选项卡中设置您的设置,如下所示。 在此处输入图像描述

然后如下保存设置。

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
于 2020-12-01T08:20:41.053 回答