简体   繁体   中英

VB.Net ArrayList

I'm trying to wrap my head around array lists in vb.net. I am self teaching via the internet but can't seem to figure it all out. Some points i'm having trouble connecting the dots to:

  1. How do i make the array list universal so it's not stuck in a subroutine and I can allow any sub to access the list.
  2. Allowing the list to be added to or removed from from another control on the form.
  3. Saving this array list so the program will populate the list box with it on startup.
  4. Here is an image of the basic concept for the visual:

    https://imgur.com/lBbopD8

Up to question 3, using a List(Of T) was the way to go. It may still be but certainly not completely and maybe not at all. Before the advent of the List(Of T) , Microsoft recognised that storing Strings in a collection was the most common requirement so, to provide type-safety in that case, they provided the StringCollection class. You say that you want to persist your list of values between sessions so that probably means using My.Settings and it is actually possible to create a setting of type StringCollection .

I would suggest that you open the Settings page of the project properties and add a setting of type StringCollection . Once added, that list will be automatically loaded at startup and saved at shutdown, with no code required from you. You can access it anywhere in the app via My.Settings and you can call Add and Remove or index it or loop over it in exactly the same way as you would an ArrayList or List(Of String) .

There is one small gotcha with a StringCollection in settings though. It will actually be Nothing by default. The trick to avoiding that is to edit its Value on the Settings page to add an item, commit that, then edit it again to remove the item. You'll see that, instead of the Value field being empty, it will then contain a snippet of XML. It's that that creates the StringCollection object in the settings file.

As I said, if you want to persist this list between sessions then I strongly recommend using settings this way. Just note that, in order to edit settings, they have to be User-scoped rather than Application-scoped. What that means is that each separate Windows user will have their own copy of the setting and thus their own value. If you only log into Windows with one account then it's of no consequence. If multiple Windows users use the app then it may be considered beneficial in most cases but may be a problem if you want universal settings that can be edited. If it's a problem, you will need to handle persistence yourself but be aware that a standard Windows user (as opposed to an admin) won't have access to write data everywhere, which is exactly why User-scoped settings work the way they do.

Also, while you must use a StringCollection for persistence in settings, you may or may not want to use the same collection in the rest of your code. You might access the collection directly all the time or you may choose to copy the collection to a List(Of String) at startup and then copy the data back at shutdown. Unless you want to avoid committing items until shutdown, I wouldn't bother with the extra collection.

So an important thing to know is that you can directly populate and edit the listbox without having an additional ArrayList. You would use the example code below as follows:

   'addTb is the text box you had in the image; this will run on button press event

    ListBox1.Items.Add(addTB.Text)

If you are looking to dump ArrayList data into the list box use something like this:

   'creates new arraylist and adds items to it
    Dim listStuff As ArrayList = New ArrayList
    listStuff.Add("Hi")
    listStuff.Add(2)

    'makes listStuff the datasource for your list box
    ListBox1.DataSource = listStuff

Finally, if you are wanting to loop through ArrayList items use something like this:

   'remember to do count - 1 or you will receive error since index will be out of range
    For i = 0 To listStuff.Count - 1
        If listStuff.Item(i) = "" Then
            'do stuff here
        End If
    Next

Hopefully that helps. Let me know if I need to be more clear since this is my first stack overflow answer :)

You are using a ListBox control to visualize a collection of presumably String values from a TextBox control. The ListBox exposes the visualized collection via the Items property.

How do i make the array list universal so it's not stuck in a subroutine and I can allow any sub to access the list.

Because the ListBox control resides on the Form, you can access the Items property through any access level in your Form's code.

Allowing the list to be added to or removed from from another control on the form.

From the Items property, you can use the Add method to add a single value, the AddRange method to add multiple values via an array or another ListBox collection, the Insert method to insert a value at a given index, the Remove method a specific item, and the RemoveAt method to remove an item at a given index.

So in your case, since you're presumably adding the value from the Text property of the TextBox to the ListBox, it is as simple as:

ListBox1.Items.Add(TextBox1.Text)

Saving this array list so the program will populate the list box with it on startup.

You have a few options, but generally the idea is to is write each value in the Items property to its respective line at a given file when the application closes and then load each value back by reading each line from the same file. Another option is to use My.Settings, though I think with your level of expertise, it would probably be better to stick with the read/write to a file option so you don't have to worry about some pitfalls associated with this option. Here would be a quick example of reading/writing the items to a file:

'Write the items to the file
Dim items(ListBox1.Items.Count - 1) As String
ListBox1.Items.CopyTo(items, 0)
IO.File.WriteAllLines("file.txt", items)

'Read the items to the file
ListBox1.Items.AddRange(IO.File.ReadAllLines("file.txt"))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM