Vb.net 从列表框中获取所选项目

Vb.net 从列表框中获取所选项目,vb.net,listboxitem,Vb.net,Listboxitem,大家星期三好 我遇到了一堵砖墙(对于树荫树编码人员来说很容易做到),我有一个列表框,其中填充了一个数据表。我想从所选项目中获取所有许可证ID。换句话说,如果用户从列表框的8个选项中选择3个,那么我需要为这3个选项中的每一个获取LicenseID 下面是我如何填充列表框的 Using cmd As New OleDbCommand(cmdText, conn) conn.Open() Dim reader As OleDbDataReader =

大家星期三好

我遇到了一堵砖墙(对于树荫树编码人员来说很容易做到),我有一个列表框,其中填充了一个数据表。我想从所选项目中获取所有许可证ID。换句话说,如果用户从列表框的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搜索了一些例子,但似乎没有一个适合我


除了从
SelectedItems
集合中获取
DataRowView
对象之外,标准
ListBox
的任何帮助都不会对您有所帮助。作为替代方案,这里有一个自定义控件,您可以使用它来代替标准的
列表框
,它将帮助您:

公共类ListBoxEx
继承列表框
公共函数GetItemValue(项作为对象)作为对象
Dim index=Me.Items.IndexOf(item)
如果(索引-1和also Me.DataManager不是空的),那么
Return Me.filterietemonproperty(Me.DataManager.List(index)、Me.ValueMember)
如果结束
一无所获
端函数
末级
然后,您可以调用
GetItemValue
,传递任何项目,并获取与您在
SelectedItem
中获得的
SelectedValue
相同的值。要获取数组中的所有值,请执行以下操作:

Dim licenseIDs = myListBoxEx.SelectedItems.
                             Cast(Of Object)().
                             Select(Function(o) CInt(myListBoxEx.GetItemValue(o)).
                             ToArray()
有关详细信息,请参阅

如果您不知道,如果您向项目中添加了一个类,并且它是一个控件或组件,那么一旦生成,它将自动显示在工具箱窗口的顶部


如果您已经有了标准的
列表框
,并且不想删除它并添加新控件,则可以手动编辑设计器代码文件以更改现有控件。为此,请打开解决方案资源管理器并选择项目中的一个节点,单击“显示所有文件”按钮,展开表单的节点,双击设计器代码文件,然后在相关位置将
列表框
替换为
列表框
(或任何您称之为它的名称)。我建议先创建一个备份副本或与源代码管理同步,以防您把它搞砸。

我将向您展示如何自己得出这个问题的答案:

我已经建立了一个表格:

真的很简单;列表框与您的列表框类似。这个按钮就是为了给我一个简单的方法来停止代码并检查正在发生的事情

我编写了一些代码,将一些内容填充到我的列表框中。这是一个屏幕截图,因为您是否拥有这段代码并不重要,所以您不需要编写这段代码(因此我很难复制粘贴):

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

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

现在,我可以指向范围内的某个变量(如ListBox1)并查看工具提示,或者打开“局部变量/自动变量”窗口,查看范围内的变量并深入其中:

在“自动/局部变量”窗口中展开列表框。它有很多特性。滚动至SelectedItems:

SelectedItems是一个事物的集合。。我们可以看出,部分原因是微软擅长用复数名称命名事物集合,还因为检查员说“枚举可枚举项”。。这意味着这是一堆我们可以看到的东西

展开它,我们可以看到我的selecteditems只选择了一件事(当我点击按钮时,我的列表中确实只有一个选择的项目)

我们可以看到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(或与“跨步”/“跨步进入”相关联的任何键)移动黄色条并逐个执行代码行:

只有编写了完整的合法代码,才能继续执行代码,但不必逻辑正确。通过拖动页边空白处的黄色箭头(或右键单击并选择Set Next Statement),可以备份并再次执行。在这里,我加入了一些伪语句,以便继续,这样我可以检查animalID是否像我预期的那样正确地设置在X中。我指向X以查看值: