如何获取 ListBox 的对象?

Posted

技术标签:

【中文标题】如何获取 ListBox 的对象?【英文标题】:How can I get the objects of the ListBox? 【发布时间】:2022-01-11 03:07:10 【问题描述】:

我试图从 ListBox 中获取对象,但 ListBox.Items 只返回字符串,然后我想检查该项目是否被鼠标光标聚焦,我该怎么做?

【问题讨论】:

Items 集合包含传递给 ListBox 的 ItemsSource 属性的元素。要么显式添加 ListBoxItem,要么使用 ListBox 的 ItemContainerGenerator 获取字符串项的 ListBoxItem 容器。 呃,你能给我举个例子吗?无论你刚才说什么,我都不知所措,我不知道如何将其付诸实践,欢迎使用 sn-p 代码查看它是如何编写的 :)。 docs.microsoft.com/en-us/previous-versions/dotnet/… 与其在问题中编辑解决方案,不如写一个答案。可以回答您自己的问题。 @Mary 我还是这个平台的新手,所以我正在学习如何最好地在这里发布我的代码,我现在意识到将它作为文本会更好。 Clemens 之前已经回答了这个问题,所以接下来我将只为我的代码输入文本。谢谢。 【参考方案1】:

您有一个处理程序,它遍历 ListBox 项目:

Private Sub ListBox_PreviewMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) Handles listBox.PreviewMouseLeftButtonDown

    Dim mySender As ListBox = sender
    Dim item As ListBoxItem

    For Each item In mySender.Items

        If item.IsFocused Then
            MsgBox(item.ToString)
        End If

    Next

End Sub

您可以按原样添加项目(例如Strings):

Private Sub OnWindowLoad(sender As Object, e As RoutedEventArgs)

    listBox.Items.Add("Item1")
    listBox.Items.Add("Item2")
    listBox.Items.Add("Item3")

End Sub

或点赞ListBoxItems:

Private Sub OnWindowLoad(sender As Object, e As RoutedEventArgs)

    listBox.Items.Add(New ListBoxItem With  .Content = "Item1" )
    listBox.Items.Add(New ListBoxItem With  .Content = "Item2" )
    listBox.Items.Add(New ListBoxItem With  .Content = "Item3" )

End Sub

在第一种方式中(按原样添加字符串时) - 处理程序将抛出有关无法将String 转换为ListBoxItem 的异常,因为您明确声明了Dim item As ListBoxItem。第二种方式 - 不会出现强制转换异常,因为您添加的不是字符串,而是 ListBoxItem.ContentString

显然,您可以声明它Dim item As String 以使事情正常进行,但 String 不会有 IsFocused 属性,您可以使用它来显示消息框。

即使您将数组或字符串列表设置为ItemsSourceListBox - 它也会导致异常。但是ListBoxItems 的数组或列表设置为ItemsSource 可以在您的处理程序中正常工作。

所以答案是 mySender.Items 不是 ListBoxItems 的集合,您尝试对其进行投射和迭代。您应该将您的 ItemsSource 重新定义为 ListBoxItems 的集合或将迭代项的类型从 Dim item As ListBoxItem 更改为 Dim item As String 并丢失 IsFocused 属性。

您也可以只使用 SelectedItem 而无需迭代和检查 IsFocused 并使用 TryCast 的安全强制转换并检查项目是否为 ListBoxItem 或仅使用 SelectedItem 本身并在最后调用 ToString :

Dim mySender As ListBox = sender
Dim item

If mySender.SelectedItem IsNot Nothing Then
    item = TryCast(mySender.SelectedItem, ListBoxItem)

    If item Is Nothing Then
        item = mySender.SelectedItem
    End If

    MsgBox(item.ToString)

End If

【讨论】:

或者使用ListBox的ItemContainerGenerator来获取一个整数项的ListBoxItem容器。【参考方案2】:

Clemens 帮助我找到了以下解决方案:

解决方案:

item = CType((mySender.ItemContainerGenerator.ContainerFromIndex(myVar)), ListBoxItem)

mySender 是您的 ListBox,myVar 是您的 Integer。

【讨论】:

以上是关于如何获取 ListBox 的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在后面的代码中获取 ListBox ItemsPanel

c# winform listbox 如何 获取 当前 选中的值 急!!!

如何从选定的 ListBox Control 的 listboxitem 中获取属性? C#

在Excel上插入一个listbox组件,在VBA中我想用这个listbox组件作为对象,获取选择的listbox里的值。

vba窗体中如何获取列表框listbox1选中行的值返回到文本框textbox1。

获取ListBox中的ListBoxItem