2016-02-29 9 views
0

ВведенияКак я могу сохранить ListBox элементы для my.settings

Я посмотрел, как сохранить элементы в ListBox в my.settings на некоторое время теперь, и есть очень много разных ответов. Я пробовал их все (немного излишне сказать), но никто не работал. Вероятно, потому, что я делаю что-то неправильно из-за плохого объяснения или моего новичка на этапе программирования.

Таким образом, у меня есть форма, где пользователь может установить набор настроек. Все они останутся такими, какими они были, когда он закрывает приложение и снова открывает его. Текстовые поля, флажки и т. Д. Отлично работают, но по какой-то причине Listbox сложнее, чем я ожидал бы, чтобы быть сохраненным.

Мой ListBox

Пользователь добавляет элементы в ListBox, как это (Пишет что-то вроде c:\test в текстовом поле tbpath1, нажимает кнопку btnAdd1 и текст станет пунктом в ListBox 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) 

Моя попытка(вероятно, один из десяти попыток)

Так что это одна из моих попыток. Хотелось бы, чтобы это было легко.

enter image description here

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'

Я предполагаю, что это имеет какое-то отношение элементов не являются строкой, и так далее, но я не уверен, где идти с этим. Может ли кто-нибудь обернуть его простым объяснением?

+0

Измените тип для параметра «String.Collection». В списке есть много элементов, вы пытаетесь сохранить их в одну строку. – Plutonix

+0

Хорошо, спасибо. Думаю, на один шаг ближе. :) – MadsTheMan

ответ

1

Если вы не добавили хотя бы один элемент в 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() 

Вы также можете «обмануть» его, чтобы инициализировать его для вас. Добавьте элемент через вкладку «Настройки», сохраните проект и удалите элемент.

Вы также можете создать List(of String), чтобы сохранить данные. Сериализуйте его самостоятельно с помощью 1-2 строк кода и используйте его как DataSource для списка. Это проще, чем перемещать предметы из одной коллекции в другую и синхронизировать их. This answer shows сериализация List(Of Class), но принцип тот же.

+0

Большое спасибо за ваш ответ, Плутоникс. Я собираюсь сделать некоторые тесты сразу. Не могли бы вы привести пример того, как загрузить этот параметр в form_load? Я бы предположил что-то вроде этого 'lbchannel1.Items = settings._lbChannel1', но это не кажется правильным. – MadsTheMan

+1

Оба элемента списка и настройки - это коллекции, но они разные типы коллекций, поэтому вам нужно будет использовать цикл, как показано в ответе, чтобы добавлять элементы по одному от одного к другому. Его еще один шаг вы можете пропустить, если вы его сериализуете самостоятельно – Plutonix

+0

Спасибо! Я заработал. :) – MadsTheMan

 Смежные вопросы

  • Нет связанных вопросов^_^