#vb.net #listbox #selecteditem #valuemember
#vb.net #список #выбранный элемент #значение элемента
Вопрос:
Я видел пару сообщений, в которых задавался аналогичный вопрос, но я не смог успешно дублировать ответы в своем коде. Следующий код добавляет элементы и их значения в список.
Public Shared Sub ListFiles(hTab As Hashtable)
Debug.Print("create file and key" amp; Now)
Dim Enumerator As IDictionaryEnumerator
Enumerator = hTab.GetEnumerator()
Dim MyKeys As ICollection
Dim Key As Object
MyKeys = hTab.Keys()
If (hTab.Count > 0) Then
For Each Key In MyKeys
Dim sfileName As String = hTab(Key)
Dim first As Integer = sfileName.IndexOf("_")
Dim last As Integer = sfileName.LastIndexOfAny("_")
Dim first2 = (first 1)
Dim splitFile = sfileName.Substring(first2)
frmViewFiles.ListBox1.Items.Add(splitFile)
frmViewFiles.ListBox1.ValueMember = Key
frmViewFiles.ListBox1.SelectedValue = Key
Next
End If
End Sub
Когда я запускаю свой код, чтобы получить значение элемента выбранных элементов
Dim file = ListBox1.ValueMember.ToString()
Я могу получить доступ к первому элементу, который я выбираю, но последующие выборы не меняют значение элемента на значение выбранного элемента.
Пожалуйста, направьте меня.
Спасибо за ваши ответы. это мой новый код:
Public Shared Sub runListFiles(CustomerId As String)
Dim cfp As New CloudFilesProvider(cloudId)
Dim containerObjectList As IEnumerable(Of ContainerObject) = cfp.ListObjects(container:="EstherTest", identity:=cloudId, prefix:=CustomerId amp; "_")
For Each file As ContainerObject In containerObjectList
Dim sFullFileName As String = file.Name
Dim first As Integer = sFullFileName.IndexOf("_")
Dim first2 = (first 1)
Dim splitFile = sFullFileName.Substring(first2)
'frmViewFiles.ListBox1.Items.Add(splitFile)
'frmViewFiles.ListBox1.ValueMember = sFullFileName
Dim fb = New myFile
fb.FileName = splitFile
fb.FullPath = sFullFileName
frmViewFiles.ListBox1.Items.Add(fb)
frmViewFiles.ListBox1.DisplayMember = fb.FileName
frmViewFiles.ListBox1.ValueMember = fb.FullPath
Это мой класс:
Public Class myFile
Public Property FileName As String
Public Property FullPath As String
Public Sub New(f As String, b As String)
FileName = f
FullPath = b
End Sub
Конечный класс
Пожалуйста, посмотрите мой комментарий ниже и помогите
Комментарии:
1. возможно, несколько слов о том, что вы пытались сделать, а не о том, как это может помочь. что находится в хеш-таблице, что вы пытаетесь отобразить и что добавляется? По сути, вы неправильно используете значение элемента.
Ответ №1:
ValueMember
должно указывать имя свойства объекта, добавленного в коллекцию элементов: the property to use as the actual value for the items in the ListControl.
Вы не добавляете объекты в элемент управления, поэтому Key
из хэш-таблицы бессмысленно, как ValueMember
. Ваше сообщение ссылается на файловую переменную попутно, поэтому я предполагаю, что это связано с отображением имени файла при желании получить полный путь при выборе / нажатии. Веб-формы / Winforms / WPF не были указаны, я предполагаю, что WinForms:
Public Class myFile
Public Property FileName As String
Public Property FullPath As String
Public Property FileSize As Int64 ' just so there is something else
Public Sub New(f as String, p as String, s as Int64)
FileName = f
FullPath = b
FileSize = s
End Sub
End Class
Допустим, мы хотим добавить некоторые из них в список, для каждого добавленного элемента мы хотим FileName
отобразить в виде текста, но хотим вернуть их с помощью FullPath
:
Dim f As myFile
' assume these come from a fileinfo
For Each fi as FileInfo in DirectoryInfo.GetFiles(searchFor)
f = New myFile
f.FileName = fi.Name
f.FullPath = fi.FullPath
f.FileSize = fi.Length
' myFile accepts all the prop values in the constructor
' so creating a new one could also be written as:
' f = New myFile(fi.Name, fi.FullPath, fi.Length)
myListBox.Items.Add(f)
Next n
Если объекты myFile были сохранены в a List(of myFile)
, а не добавлены в элемент управления, мы можем привязать список к источнику данных и не выполнять итерации или копирование:
mylistBox.DataSource = myFileList
В любом случае, Display- и ValueMember относятся к именам свойств, которые мы хотим использовать:
myListBox.DisplayMember = "FileName" ' indicate property name of obj to SHOW
myListBox.ValueMember = "FullPath" ' prop name of object to return
Когда вы выбираете элемент списка, myListBox.SelectedValue
он будет ссылаться на FullPath
myFile
объект, на который нажали. Все SelectedIndex
равно будет ссылаться на индекс элемента в списке.
tl; dr
ValueMember и DisplayMember относятся к именам свойств объектов, представленных в списке.
Примечание:
Комментарии:
1. Спасибо за вашу помощь. Кажется, что ValueMember не будет подходящим вариантом, поскольку каждый элемент valuemember отображается как последний введенный. Кроме того, в списке выводится «page.myFile» вместо элемента отображения элементов. Я отредактировал свой код, чтобы отразить все внесенные изменения.
2. @user3772954 У вас все еще есть ошибка, отображение и значение являются строками, именами свойств. Обратите внимание, что я использую
"FileName"
и"FullPath"
, то есть, имена свойств. Вы используетеfb.FileName
(это будет имя типа, которое вы видели). Для значения элемента вы сбрасываете их всеfb.FullPath
, что является значением свойства, а не именем свойства. Их не нужно устанавливать в цикле, это отображает весь СПИСОК, а не каждый элемент. Цикл приводит к тому, что все они устанавливаются на последний. Вы также можете задать имена в конструктореfb = New myFile(the name, the path)
Ответ №2:
Я знаю, что это много лет спустя, но все еще актуальная информация. Мне потребовалось некоторое время, чтобы разобрать то, что было сказано выше, пока я не проверил его полностью, поэтому я подумал, что это может помочь, если я немного переформулирую его.
При выборе элемента списка,
myListBox.SelectedValue
является содержимым поля,myListBox.ValueMember
.ValueMember
содержитField Name
,SelectedValue
содержит содержимое поля.myListBox.SelectedItem
является содержимым поляmyListBox.DisplayMember
.DisplayMember
содержит имя поля иSelectedItem
содержит значение поля.
SelectedIndex
Относится к индексу элемента в списке. Чтобы увидеть, какой элемент выбран, обратитесь myListBox.SelectedIndex
. Вы можете, например, изменить выделение на последний элемент в списке, используя myListBox.SelectedIndex = myListBox.Items.Count - 1
Если вы хотите отобразить значения, то
Console.WriteLine("The value of {0} is {1}",myListBoxDisplayMember,myListBox.SelectedItem)
Console.WriteLine("The Value of {0} is {1}",myListBox.ValueMember,myListBox.SelectedValue)