У меня есть список, в котором есть описание и значение, сохраненное в нем (описание - это имя клиента, а valueitem - это идентификатор клиента в базе данных). В моей форме у меня есть два списка, один из которых имеет полный список список имен клиентов, а затем пользователь выбирает из этого списка и добавляет те, с которыми они хотят связать пользователя, в список справа. Когда я прихожу, чтобы сохранить запись, я хочу сохранить список customerID в таблице, чтобы я мог определить, к каким клиентам относится эта запись.
Мой код просматривает список, используя цикл For .. Next:
For n = 0 To lbxCustomerList.Items.Count - 1
U.CustomersLinkedTo += lbxCustomerList.Items(n).Value.ToString() & ","
Next
U - это класс записей пользователя, а поле CustomersLinkedTo - это поле NVarchar (255), для которого я создам разделенный запятыми список идентификаторов CustomerID, которым пользователь назначил этого пользователя.
Проблема в том, что lbxCustomerList.Items (n). Значение не допускается. Я использую VB.NET и Dot Net Framework V4.
Я попытался загрузить ListBox в переменную ListBox.ObjectCollection, а затем посмотреть, позволяет ли мне получить доступ к ValuItems, но это тоже не позволяет. Как получить значения в отличие от текста описания ??
РЕДАКТИРОВАТЬ ****
Чтобы помочь тем хорошим людям, которые пытаются мне помочь, я добавляю ниже код, который я использую для заполнения списка клиентов, а затем код, который я использую для заполнения lbxCustomersLinkedTo, который содержит выбранных ими клиентов:
Заполните список слева, из которого пользователь выбирает имена клиентов, и добавляет их в список справа, который содержит подмножество, которое пользователь хочет выделить пользователю.
Private Sub PopulateCustomerList()
Dim c As New Customer()
Dim cc As New ArrayList()
Try
'Clear list
lbxCustomerList.Items.Clear()
lbxCustomerList.DataSource = Nothing
'Populate from DB.
cc = c.GetCustomersForDropLists(customerTypeEnum.Active)
lbxCustomerList.DataSource = cc
lbxCustomerList.DisplayMember = "DisplayedText"
lbxCustomerList.ValueMember = "ReturnedID"
lbxCustomerList.Refresh()
Catch ex As Exception
PEH("PopulateCustomerList", "frmUserSetup", ex.Message)
End Try
End Sub
Код, который добавляет элементы, которые пользователь выбирает из списка «Клиенты», к тому, который меня интересует, и который я использую для создания списка «Идентификатор клиента», который я хочу добавить в запись своего пользователя.
Private Sub AddToList()
Dim SelItems As New ListBox.SelectedObjectCollection(lbxCustomerList)
SelItems = lbxCustomerList.SelectedItems
Try
If lbxCustomerList.SelectedItems.Count > 0 Then
For n = 0 To SelItems.Count - 1
lbxCustomersLinkedTo.Items.Add(SelItems(n))
Next
lbxCustomerList.ClearSelected()
End If
Catch ex As Exception
PEH("AddToList", "frmUserSetup", ex.Message)
End Try
End Sub
Это изображение части формы пользователя, о которой я говорю:
![Select Customers Part Of Screen](https://i.stack.imgur.com/zfDPP.png)
@ ThePeter - Спасибо, ваша рутина с небольшим изменением сделала свое дело.
Теперь это мой код в процедуре сохранения:
'Get the Customers an officer works for into a comma separated list.
'First remove any existing items.
U.CustomersLinkedTo = ""
If (lbxCustomersLinkedTo.Items.Count > 0) Then
For n = 0 To lbxCustomersLinkedTo.Items.Count - 1
If n = lbxCustomersLinkedTo.Items.Count - 1 Then
U.CustomersLinkedTo += WhatValueIsSelectedInListBoxForIndex(lbxCustomersLinkedTo, n) 'Don't add comma to last item.
Else
U.CustomersLinkedTo += WhatValueIsSelectedInListBoxForIndex(lbxCustomersLinkedTo, n) & ","
End If
Next
End If
Эта ваша процедура слегка изменена, так как изначально выдает ошибку:
''' <summary>
''' Use this function to get the values of an item in the list box. It works with list boxes that are bound to a DataSet, and those that have been populated via code, or manually populated via the GUI.
''' </summary>
''' <param name="lstBox">The list box you want to find the selected value in.</param>
''' <param name="iIndex">The number of the item in the ListBox that you want the value for.</param>
''' <param name="DesiredReturnValue">By default it returns the hidden return value, but you can ask for the display value if desired.</param>
''' <returns>This function returns a String value.</returns>
Public Function WhatValueIsSelectedInListBoxForIndex(ByVal lstBox As ListBox, ByVal iIndex As Integer, Optional ByVal DesiredReturnValue As SelectByMode = SelectByMode.ByReturnValue) As String
Dim sReturn As String = ""
Try
If DesiredReturnValue = SelectByMode.ByReturnValue Then
'Returns the value that is not visible, but stored in the "ValueMember" field of the bound ComboBox
If lstBox.ValueMember.Length > 0 And lstBox.DisplayMember.Length > 0 Then
'This is a bound listbox.
Dim drSelectedItem As DataRowView = lstBox.Items(iIndex)
sReturn = drSelectedItem.Item(0).ToString
Else
Try
'This listbox was populated in code with display values and return values.
sReturn = lstBox.Items(iIndex).ReturnedID
Catch ex As Exception
PEH("WhatValueIsSelectedInListBoxForIndex - Populated Code section", "frmUserSetup", ex.Message)
End Try
End If
ElseIf DesiredReturnValue = SelectByMode.ByDisplayName Then
'Return the selected TEXT (visible in the control)
If lstBox.ValueMember.Length > 0 And lstBox.DisplayMember.Length > 0 Then
'This is a bound listbox.
Dim drSelectedItem As DataRowView = lstBox.Items(iIndex)
sReturn = drSelectedItem.Item(1).ToString
Else
sReturn = lstBox.Items(iIndex).ToString
End If
Else
sReturn = ""
End If
Catch Ex As Exception
PEH("WhatValueIsSelectedInListBoxForIndex", "frmUserSetup", Ex.Message)
sReturn = ""
End Try
If sReturn Is Nothing Then sReturn = ""
Return sReturn
End Function
Бит, который я должен был изменить, чтобы он соответствовал моему списку, был строкой:
'This listbox was populated in code with display values and return values.
sReturn = lstBox.Items(iIndex).ReturnedID
С вашей помощью это теперь работает и заполняет поле базы данных напрямую.
Сив