如何解决从列表框中获取选定的项目
所有星期三好。
我遇到了一堵砖墙(对于阴影树编码器来说很容易做到)我有一个列表框,其中填充了一个数据表。我想从所选项目中获取所有的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周围搜索了一些示例,但似乎没有一个适合我。
感谢任何帮助
解决方法
我将向您展示如何自己得出答案:
我已经建立了一个表格:
真的很简单;列表框就像您的列表框。该按钮在那里,为我提供了一种简单的方法来停止代码并检查发生了什么。
我写了一些代码,将一些东西填充到列表框中。这是一个屏幕快照,因为您不需要完全具有此代码,因此您无需编写此代码(因此,为什么我很难复制粘贴内容):
我双击我的按钮以创建一个单击处理程序。我没有编写任何代码,但是我在方法声明上设置了一个断点-看到它是红色的吗?单击点所在的边距,以在代码中放置断点。当您点击它们时,代码停止并等待您检查:
我已经运行了我的应用程序并单击了我的按钮。该代码已停止,并且VS已切换为向我显示代码,而不是应用程序:
我现在可以指向范围内的某个变量(例如ListBox1)并查看工具提示,或者我可以打开Locals / Autos窗口并查看范围内的变量并进行深入研究:
在Autos / Locals窗口中展开ListBox。它具有很多特性。滚动到SelectedItems:
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”相关的任何键)来移动黄色条并一一执行代码行:
只有编写了完整的合法代码,您才可以随心所欲地执行代码,但这在逻辑上不一定是正确的。您可以通过拖动空白处的黄色箭头来备份并再次执行(或右键单击并选择“设置下一条语句”)。在这里,我放置了一些虚拟语句以继续前进,因此我可以像我期望的那样检查我的animalID是否在X中正确设置。我指向X来查看值:
,过去从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
(或您所说的任何名称)。我建议您先创建备份副本或与源代码管理进行同步,以防万一您搞砸了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。