Получить значение выбранного элемента в списке

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