VB.NET 2022运行时加载CheckedListBox获取选中项报错求助
VB.NET CheckedListBox运行时加载数据后获取选中项报错的解决办法
问题描述
在VB.NET 2022中运行时为CheckedListBox加载数据,获取选中项时出现以下错误:
Operator '&' is not defined for string '' and type 'DataRowView'
设计时加载该CheckedListBox则能正常工作。相关代码如下:
加载CheckedListBox的方法
Public Sub loadListBox(ByVal lst As CheckedListBox, ByVal sql As String, ByVal fldDsp As String, ByVal fldVal As String) Try 'open DB Connection openConn() Dim lstDS As New DataTable Dim lstAD As SqlDataAdapter Dim cboCMD As New SqlCommand(sql, Qconn) lstAD = New SqlDataAdapter(sql, Qconn) lstAD.Fill(lstDS) lst.Items.Clear() lst.SelectedIndex = -1 With lst .Items.Clear() .DataSource = Nothing .Text = fldDsp .DataSource = lstDS .ValueMember = fldVal .DisplayMember = fldDsp End With Catch ex As Exception msgError("ERROR:Failed Loading Values " + ex.Message) Exit Sub Finally closeConn() End Try End Sub
窗体加载时的调用代码
' on form load Dim symp As String = "SELECT distinct facility FROM [eLab].[settings].[Locations]" frm.chk_locations.Items.Clear() loadListBox(frm.CheckedListBox1, symp, "facility", "facility")
获取选中项的方法(原报错代码)
Public Function getCheckedItems(ByVal chk As CheckedListBox) As String Dim items As String = "" If chk.CheckedItems.Count > 0 Then items = "" & chk.CheckedItems(0) & "" 'check if the checked items are more than 1 If chk.CheckedItems.Count > 1 Then For i As Integer = 1 To chk.CheckedItems.Count - 1 items = items & "," & chk.CheckedItems(i) & "" Next End If End If Return items End Function
调用获取方法的代码
Dim configlocation As String = getCheckedItems(frm.CheckedListBox1) msgBox(configlocation)
期望结果:所有选中的位置以逗号分隔的字符串,例如:LocationA,Location X
错误原因
运行时通过DataSource绑定DataTable后,CheckedListBox的CheckedItems集合中存储的是DataRowView对象,而非直接的字符串。原代码尝试将DataRowView直接与字符串拼接,VB.NET无法识别这种操作,因此报错。而设计时加载通常是直接添加字符串项,所以不会有此问题。
修复方案
修改getCheckedItems方法,将每个CheckedItem转换为DataRowView,然后提取对应的DisplayMember或ValueMember字段值。
修改后的获取选中项方法
Public Function getCheckedItems(ByVal chk As CheckedListBox) As String Dim items As New List(Of String)() If chk.CheckedItems.Count > 0 Then For Each item As Object In chk.CheckedItems ' 将对象转换为DataRowView Dim drv As DataRowView = DirectCast(item, DataRowView) ' 提取DisplayMember对应的字段值,若需要存储的实际值,可替换为drv(chk.ValueMember) items.Add(drv(chk.DisplayMember).ToString()) Next End If ' 用String.Join直接拼接成逗号分隔的字符串 Return String.Join(",", items) End Function
说明
- 使用
DirectCast将CheckedItem转换为DataRowView,确保类型安全。 - 通过
drv(chk.DisplayMember)获取显示的文本值,若需要存储的实际值,可替换为drv(chk.ValueMember)。 - 改用
List(Of String)存储选中项,最后用String.Join拼接,代码更简洁高效,避免手动循环拼接的冗余。
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

