2016-02-29 3 views
0

IntroComment puis-je enregistrer des éléments de ListBox à My.Settings

J'ai regardé comment enregistrer les articles dans une zone de liste à My.Settings pendant un certain temps maintenant et il y a tant de réponses différentes. Je les ai tous essayés (un peu excessivement à dire), mais aucun n'a vraiment fonctionné. C'est probablement parce que je fais quelque chose de mal à cause d'une mauvaise explication ou de ma phase de débutant à la programmation.

Donc j'ai un formulaire où l'utilisateur peut définir un tas de paramètres. Ils vont tous rester comme ils l'étaient quand il ferme l'application et l'ouvre de nouveau. Les boîtes de texte, les cases à cocher et ainsi de suite fonctionnent bien, mais pour une raison quelconque, la Listbox est plus difficile que ce à quoi je m'attendais.

Mon listbox

L'utilisateur ajoute des éléments à la zone de liste comme ça (écrit quelque chose comme c:\test dans une zone de texte tbpath1, appuie sur un bouton btnAdd1 et le texte deviendra un élément dans la liste 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) 

Ma tentative(probablement l'un sur dix tentatives)

Donc, c'est l'une de mes tentatives jusqu'à présent. Je souhaite que c'était si facile.

enter image description here

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

la tentative ci-dessus, j'obtiens l'erreur 'NullReferenceException was unhandled : Object reference not set to an object instance'

Je devine qu'il a quelque chose à voir avec les articles ne pas être une chaîne et ainsi de suite, mais je ne suis pas sûr où aller avec ça. Quelqu'un peut-il envelopper d'une manière simple expliquée?

+0

Modifiez le type pour le paramètre à 'String.Collection'. La liste contient de nombreux éléments, vous essayez de les enregistrer dans une seule chaîne. – Plutonix

+0

Très bien, merci. C'est un pas de plus, je suppose. :) – MadsTheMan

Répondre

1

Si vous n'ajoutez pas au moins un élément dans l'EDI, VS n'initialise pas la collection que vous créez dans les paramètres car elle ne semble pas l'utiliser.

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() 

Vous pouvez également "le tromper" en l'initialisant pour vous. Ajouter un élément via l'onglet Paramètres, enregistrez le projet, puis supprimez l'élément. Vous pouvez également créer un List(of String) pour stocker les données. Sérialisez-le vous-même avec 1-2 lignes de code et utilisez-le comme DataSource pour la liste. C'est plus simple que de faire la navette d'une collection à une autre et de les synchroniser. This answer shows une sérialisation un List(Of Class) mais le principe est le même.

+0

Merci beaucoup pour votre réponse, Plutonix. Je vais faire des tests tout de suite. Pourriez-vous me donner un exemple de la façon dont je chargerais ce paramètre dans le formulaire_load? Je suppose que quelque chose comme ça 'lbchannel1.Items = settings._lbChannel1', mais cela ne semble pas correct. – MadsTheMan

+1

Les éléments de la zone de liste et les paramètres sont des collections, mais il s'agit de types de collections différents. Vous devez donc utiliser une boucle comme indiqué dans la réponse pour ajouter des éléments un par un de l'un à l'autre. C'est une autre étape que vous pouvez passer si vous le sérialisez – Plutonix

+0

Merci! Je l'ai fait fonctionner. :) – MadsTheMan