如何将列表框项目保存到 my.settings

How can I save listbox items to my.settings

简介

我已经查找了一段时间如何将列表框中的项目保存到 my.settings,并且有很多不同的答案。我已经尝试了所有方法(说起来有点过分),但 none 确实有效。这可能是因为我在编程方面的新手阶段或由于错误的解释而做错了一些事情。

所以我有一个表单,用户可以在其中设置一堆设置。当他关闭应用程序并再次重新打开时,所有这些都将保持原样。文本框、复选框等工作正常,但由于某些原因,列表框比我预期的更难保存。

我的列表框

用户像这样将项目添加到列表框中(在文本框 tbpath1 中写入类似 c:\test 的内容,按下按钮 btnAdd1,文本将成为列表框中的项目lbchannel1)

Private Sub btnAdd1_Click(sender As Object, e As EventArgs) Handles btnAdd1.Click
    Dim str As String = tbPath1.Text
    If str.Contains("\") Then
        lbchannel1.Items.AddRange(tbPath1.Text.Split(vbNewLine))
        tbext1_1.Text = (tbext1_1.Text)

我的尝试 (大概是十次尝试中的一次)

所以这是我迄今为止的尝试之一。我希望它是这么简单。

My.Settings._lbchannel1.Clear()
For Each item In lbchannel1.Items
    My.Settings._lbchannel1.Add(item)
Next
My.Settings.Save()

在上面的尝试中,我得到错误 'NullReferenceException was unhandled : Object reference not set to an object instance'

我猜这与不是字符串的项目有关,等等,但我不确定该从何做起。有人可以简单解释一下吗?

如果您没有在 IDE 中添加至少一项,VS 不会初始化您在“设置”中创建的集合,因为它看起来不像您在使用它。

If My.Settings._lbchannel1 Is Nothing Then
    My.Settings._lbchannel1 = New System.Collections.Specialized.StringCollection()
End If

My.Settings._lbchannel1.Clear()
For Each item In lbchannel1.Items
    My.Settings._lbchannel1.Add(item)
Next
My.Settings.Save()

您也可以"trick"为您初始化它。通过“设置”选项卡添加项目,保存项目,然后删除项目。

您还可以创建一个 List(of String) 来存储数据。自己用 1-2 行代码将其序列化,并将其用作列表框的数据源。它比将项目从一个集合穿梭到另一个集合并保持同步要简单。 This answer shows一个序列化一个List(Of Class)但是原理是一样的