如何获取 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
和 .Content
的 String
。
显然,您可以声明它Dim item As String
以使事情正常进行,但 String 不会有 IsFocused
属性,您可以使用它来显示消息框。
即使您将数组或字符串列表设置为ItemsSource
的ListBox
- 它也会导致异常。但是ListBoxItems
的数组或列表设置为ItemsSource
可以在您的处理程序中正常工作。
所以答案是 mySender.Items
不是 ListBoxItem
s 的集合,您尝试对其进行投射和迭代。您应该将您的 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里的值。