从列表框中获取选定的项目

问题描述

所有星期三好。

我遇到了一堵砖墙(对于阴影树编码器来说很容易做到)我有一个列表框,其中填充了一个数据表。我想从所选项目中获取所有的LicenseID。换句话说,如果用户从列表框中选择了8个中的3个,则我需要获取这3个中的每个的LicenseID。

下面是我填充列表框的方式

 Using cmd As New OleDbCommand(cmdText,conn)
            conn.open()
            Dim reader As OleDbDataReader = cmd.ExecuteReader()
            dt.Load(reader)
            ListBox1License.DataSource = dt
            ListBox1License.displayMember = "InstitutionTypeAbrev"
            ListBox1License.ValueMember = "LicenseID"

        End Using

我需要从列表框中获取选定的项目,以便以后使用。

我正在考虑将选定的项添加到数组中。

我在STackOverflow周围搜索了一些示例,但似乎没有一个适合我。

感谢任何帮助

解决方法

我将向您展示如何自己得出答案:

我已经建立了一个表格:

enter image description here

真的很简单;列表框就像您的列表框。该按钮在那里,为我提供了一种简单的方法来停止代码并检查发生了什么。

我写了一些代码,将一些东西填充到列表框中。这是一个屏幕快照,因为您不需要完全具有此代码,因此您无需编写此代码(因此,为什么我很难复制粘贴内容):

enter image description here

我双击我的按钮以创建一个单击处理程序。我没有编写任何代码,但是我在方法声明上设置了一个断点-看到它是红色的吗?单击点所在的边距,以在代码中放置断点。当您点击它们时,代码停止并等待您检查:

enter image description here

我已经运行了我的应用程序并单击了我的按钮。该代码已停止,并且VS已切换为向我显示代码,而不是应用程序:

enter image description here

我现在可以指向范围内的某个变量(例如ListBox1)并查看工具提示,或者我可以打开Locals / Autos窗口并查看范围内的变量并进行深入研究:

enter image description here

在Autos / Locals窗口中展开ListBox。它具有很多特性。滚动到SelectedItems:

enter image description here

enter image description here

SelectedItems是事物的集合。.我们可以说部分原因是因为Microsoft善于用复数名称命名事物的集合,并且因为检查员说“枚举可枚举” ..这意味着它是一堆事物。我们可以让ForEach浏览

展开它,我们看到我选择的项目只有一个被选中(当我单击按钮时,我的列表中确实只有一个被选择的项目)

我们可以看到SelectedItems集合中的条目是DataRowView类型的对象。我们可以看到一个DataRowView具有一个Row属性,该属性是一个DataRow。。此行是绑定到列表的DataTable中的DataRow(您将DataSource设置为DataTable;这是该表中的一行)。>

每次您在树中挖掘另一个层次时,就像在代码中使用点或索引器一样。在这个级别上,我们已经listbox1.SelectedItems(0).Row..

因此,从中我们可以看到我们需要如下代码:

' we will "enumerate the enumerable"
For Each drv as DataRowView in listbox1.SelectedItems

  Dim originalRow = drv.Row  'we could do this to get the row...

  Dim selectedAnimaId = row("AnimalID") ' ..and then index the row to get the animal ID ..

  Dim selectedAnimalId = drv("AnimalID") ' ... or it's actually possible to index a DataRowView directly,so you can skip the row part

Next drv

在断点处停止时编写代码可能很方便,因此您可以在编写时查看事物的值,并检查方向是否正确。您可能需要使用F10(或与“ step over” /“ step into”相关的任何键)来移动黄色条并一一执行代码行:

enter image description here

只有编写了完整的合法代码,您才可以随心所欲地执行代码,但这在逻辑上不一定是正确的。您可以通过拖动空白处的黄色箭头来备份并再次执行(或右键单击并选择“设置下一条语句”)。在这里,我放置了一些虚拟语句以继续前进,因此我可以像我期望的那样检查我的animalID是否在X中正确设置。我指向X来查看值:

enter image description here

,

过去从ListBox集合中获取DataRowView对象的标准SelectedItems并不能帮助您。另外,您也可以使用自定义控件来代替标准的ListBox,以帮助您:

Public Class ListBoxEx
    Inherits ListBox
 
    Public Function GetItemValue(item As Object) As Object
        Dim index = Me.Items.IndexOf(item)
 
        If (index <> -1 AndAlso Me.DataManager IsNot Nothing) Then
            Return Me.FilterItemOnProperty(Me.DataManager.List(index),Me.ValueMember)
        End If
 
        Return Nothing
    End Function
 
End Class

然后您可以调用GetItemValue并传递任何项目,并获得与返回SelectedItem相同的值。要获取数组中的所有值:

SelectedValue

有关更多信息,请参见here

如果您不知道,如果您将一个类添加到项目中并且它是控件或组件,则一旦构建,它就会自动出现在 Toolbox 窗口的顶部。 / p>

如果已经有了标准的Dim licenseIDs = myListBoxEx.SelectedItems. Cast(Of Object)(). Select(Function(o) CInt(myListBoxEx.GetItemValue(o)). ToArray() ,并且不想删除它并添加新控件,则可以手动编辑设计器代码文件以更改现有控件。为此,打开 Solution Explorer 并在项目中选择一个节点,单击 Show All Files 按钮,展开表单的节点,双击设计器代码文件,然后在相关位置将ListBox替换为ListBox(或您所说的任何名称)。我建议您先创建备份副本或与源代码管理进行同步,以防万一您搞砸了。