You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:41:03