Постоянные пользовательские настройки VB 2013

В моей форме у меня есть меню с «сохранением файла». Когда я нажимаю «Сохранить», я хочу сохранить определенные настройки для восстановления при закрытии и повторном открытии формы. Я сделал это успешно для текста в текстовых полях и отмеченных состояний флажков, но я терплю неудачу при попытке просмотреть элементы в списке. Пожалуйста, смотрите ниже, что я пробовал...

Когда я нажимаю сохранить:

Private Sub SaveToolStripMenuItem_Click(sender As Object, e As EventArgs) 
      Handles SaveToolStripMenuItem.Click
For Each i In ListBox1.Items()
    My.Settings.ListBox1.Add(i)
Next
My.Settings.Save()
End Sub

Когда моя форма загружается:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
        Handles Me.Load
For Each i In My.Settings.ListBox1()
    ListBox1.Items.Add(i)
Next
End Sub

Я использую VB всего три дня, так что извините, если я упустил что-то простое, ха! Спасибо за любую помощь!!!


person user3688529    schedule 01.07.2014    source источник
comment
какой тип My.Settings.ListBox1? Коллекция строк? Как это не удается? возможно, вы захотите включить Option Strict, прежде чем у вас появятся вредные привычки.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 02.07.2014
comment
Тип: System.Collections.Specialized.StringCollection   -  person user3688529    schedule 02.07.2014
comment
Как включить эту опцию?   -  person user3688529    schedule 02.07.2014
comment
Вот ошибка, которую я получаю перед запуском программы: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. Надеюсь это поможет!   -  person user3688529    schedule 02.07.2014
comment
сообщения об ошибках всегда необходимо упоминать... это дает нам представление о том, что искать.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 02.07.2014
comment
возможный дубликат Добавление элементов в my.settings StringCollection   -  person zaggler    schedule 02.07.2014


Ответы (1)


Есть один небольшой глюк со StringCollection в настройках. Если вы не заполните его фальшивой переменной, тогда он начинается как Ничего, и вы не можете ничего добавить. в вашей форме загрузки добавьте это:

' if the collection has not been initialized, do so
If My.Settings.ListBox1 Is Nothing Then
    My.Settings.ListBox1= New System.Collections.Specialized.StringCollection
End If

' now it is safe to use: load strings from Setting -> form listbox
For Each s As String In My.Settings.ListBox1()
    ListBox1.Items.Add(s)
Next

В самый первый раз, когда он запускается, скорее всего, нет сохраненных настроек, поэтому нам, по сути, нужно создать для них контейнер.


Опцию Strict можно реализовать файлом, добавив это вверху:

Option Strict On

Или для проекта: Project => Properties => Compile: Вариант Строгий скорее всего справа (у меня 2012). Вы также можете установить его как постоянный параметр (рекомендуется).

Среди прочего, это не позволит вам брать переменные из воздуха и использовать их без объявления типа (что приведёт к ошибкам). Например:

For Each i In My.Settings.ListBox1()

становится

For Each s As String In My.Settings.ListBox1()  ' tell the compiler the Type
person Ňɏssa Pøngjǣrdenlarp    schedule 01.07.2014
comment
Спасибо! Попасть туда. Я поместил ваш первый оператор if в загрузку формы, но разве второй цикл for не должен проходить в меню сохранения, а не загрузки формы? Во всяком случае, это то, что я сделал, чтобы добавить элементы списка в свои настройки, когда я нажимаю «Сохранить». Я попытался изменить ваш цикл for (что, я думаю, я все равно сделал неправильно), чтобы добавить в форму загрузку, чтобы взять элементы из настроек и вернуться в список. Вот что я пробовал при загрузке формы: For i As Integer = 0 To My.Settings.ListBox1.Count - 1 ListBox1.Items.Add(My.Settings.ListBox1.Item(i)) Next - person user3688529; 02.07.2014
comment
Извиняюсь за правку кода в комментариях. Кроме того, я просто руководствуюсь интуицией, пока пытаюсь изучить основы. - person user3688529; 02.07.2014
comment
вы видели (слишком) ранний черновик ответа, ваш исходный цикл был в порядке, а код в ответе отличается от черновика. но НЕТ, If... Is Nothing идет в форме загрузки. Второй цикл загрузки формы такой же, как у вас, за исключением As String - все в порядке. (это сбивает с толку, потому что вы назвали список настроек после элемента управления пользовательского интерфейса) - person Ňɏssa Pøngjǣrdenlarp; 02.07.2014