Get ValueMember of Selected item in ListBox

2019-03-06 00:52发布

问题:

I've seen a couple of posts asking a similar question but I have not been able to duplicate the answers in my code successfully. The following code adds items and their value member to a list box.

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

When I run my code to get the selected items value member Dim file = ListBox1.ValueMember.ToString() I can acess the first item I choose but subsequent selections dont change the value member to that of the selected item.

Please direct me.

Thank you for your answers. this is my new code:

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

This is my class:

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

End Class

Please see my comment below and assist

回答1:

ValueMember is supposed to indicate the property name of an object added to the Items collection: the property to use as the actual value for the items in the ListControl.

You are not adding objects to the control, so Key from the hashtable is meaningless as the ValueMember. Your post references a file variable in passing, so I will assume this revolves around showing the filename while wanting to get the full pathname when selected/clicked. WebForms/Winforms/WPF was not indicated, I am assuming 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

Lets say we want to add some of these to a ListBox, for each item added we want FileName to display as the text, but want to get them back by 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

If the myFile objects were stored to a List(of myFile) rather than adding them to the control, we can bind the List as the DataSource and not have to iterate or copy:

mylistBox.DataSource = myFileList

Either way, Display- and ValueMember refer to the property names we wish to use:

myListBox.DisplayMember = "FileName"    ' indicate property name of obj to SHOW
myListBox.ValueMember = "FullPath"      ' prop name of object to return

When you select a listbox item, myListBox.SelectedValue would refer to the FullPath of the myFile object clicked on. The SelectedIndex would still refer to the index of the item in the list.

tl;dr

ValueMember and DisplayMember refers to the Property Names of Objects represented in the list.

Note: