views:

93

answers:

3

I'm currently trying to move through all the values added to a listbox by the user, however, I want to retrieve the actual value of each item in the listbox and not the text.

I've gotten so far with the code below, but that only gets the text and not the value.

For Each item In SelectedStoresLB.Items
            Dim tCompany As Integer = CInt(Left(item.ToString, 1))
            Dim tStore As String = Right(item.ToString, 3)
            Dim tReason As String = ReasonTxt.Text
            insertSQL = "INSERT INTO [CommsDownLog] ([DimCompanyID],[PervasiveStoreNumber],[DownReason]) VALUES (" & tCompany & ", '" & tStore & "', '" & tReason & "')"
            Dim insertRow = New SqlCommand(insertSQL, objConn)
            Try
                objConn.Open()
                insertRow.ExecuteNonQuery()
                objConn.Close()
            Catch ex As Exception
                Response.Write(ex)
            End Try
        Next

How would I go about getting the value for each item in the collection?

+5  A: 

item is a ListItem object - rather than call ToString on it, you should use the Text and Value properties to get the info you need.

Ray
A: 

Have you tried:

item.Value
Sani Huttunen
A: 

You need to be careful when iterating over a ListBox because you may end up modifying the underlying collection. By using foreach as you are, you are utilizing the underlying enumerator. I recommend you modify your iterator to the following (C# example):

foreach (ListItem li in listbox.Items.ToArray())
{
    if (li.Selected)
    {
        Controltest2.Remove(li.Value);
    }
}

By doing this, you are modify the Array's collection and not the list's collection. This assumes LINQ to object and you may need to call Cast<t> to make it work in some cases.

The reason for this is below:

The foreach statement repeats a group of embedded statements for each element in an array or an object collection. The foreach statement is used to iterate through the collection to get the desired information, but should not be used to change the contents of the collection to avoid unpredictable side effects

Source: MSDN

To get the text you want after iterating, use .Value instead of .Text. Of course, there are other ways to iterate such as going in reverse with an indexed for loop, but that's another topic :)

0A0D