Получить ValueMember выбранного элемента в ListBox

Я видел пару сообщений, задающих аналогичный вопрос, но мне не удалось успешно продублировать ответы в моем коде. Следующий код добавляет элементы и их член-значение в список.

Public Shared Sub ListFiles(hTab As Hashtable)
    Debug.Print("create file and key" & 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 & "_")
   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

Конец класса

Пожалуйста, посмотрите мой комментарий ниже и помогите


person user3772954    schedule 24.06.2014    source источник
comment
возможно, несколько слов о том, что вы собирались сделать, а не о том, как это может помочь. что находится в хеш-таблице, что вы пытаетесь отобразить и что добавляется? По сути, вы неправильно используете ValueMember.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 25.06.2014


Ответы (2)


Предполагается, что ValueMember указывает имя свойства объекта, добавленного в коллекцию Items: the property to use as the actual value for the items in the ListControl.

Вы не добавляете объекты в элемент управления, поэтому Key из хеш-таблицы бессмысленно, так как ValueMember. В вашем сообщении мимоходом упоминается файловая переменная, поэтому я предполагаю, что это связано с отображением имени файла при желании получить полное имя пути при выборе/щелчке. WebForms/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

Допустим, мы хотим добавить некоторые из них в ListBox, для каждого добавленного элемента мы хотим, чтобы 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 были сохранены в 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 по-прежнему будет ссылаться на индекс элемента в списке.

тл;др

ValueMember и DisplayMember относятся к именам свойств объектов, представленных в списке.

Примечание:

person Ňɏssa Pøngjǣrdenlarp    schedule 24.06.2014
comment
Спасибо за помощь. Кажется, что ValueMember не подходит, поскольку каждый элемент valuemember отображается как последний введенный. Кроме того, listBox выводит page.myFile вместо элемента отображения элементов. Я отредактировал свой код, чтобы отразить все изменения, которые я сделал. - person user3772954; 26.06.2014
comment
@user3772954 user3772954 У вас все еще есть ошибка, Display и ValueMember являются строками, именами свойств. Обратите внимание, что я использую "FileName" и "FullPath", то есть свойство NAMES. Вы используете fb.FileName (это будет TypeName, которое вы видели). Для ValueMember вы сбрасываете их все на fb.FullPath, что является свойством value, а не свойством name. Их не нужно устанавливать в цикле, это отображает весь СПИСОК, а не каждый элемент. Цикл заставляет их всех быть установленными на последний. Вы также можете установить имена в конструкторе fb = New myFile(the name, the path) - person Ňɏssa Pøngjǣrdenlarp; 26.06.2014

Я знаю, что это много лет спустя, но все еще актуальная информация. Мне потребовалось некоторое время, чтобы разобрать то, что было сказано выше, пока я полностью не разобрался, поэтому я подумал, что может помочь, если я немного переформулирую это.

Когда вы выбираете элемент списка,

  • 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)
person John Dovey    schedule 09.03.2021