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

System.ArgumentException错误:设置DataSource后无法修改Items集合含义解析

错误「System.ArgumentException:当DataSource属性已设置时,无法修改Items集合」的含义与解决方法

错误含义

这个异常的逻辑很直白:WinForms里的ComboBox(或同类列表控件)一旦通过DataSource绑定了数据源,就绝对不能再手动操作它的Items集合(比如Clear()、Add()这类方法)。绑定数据源后,控件的选项完全由DataSource维护,手动修改Items会破坏数据绑定的一致性,所以框架会抛出这个异常阻止你这么做。

你的代码问题分析

看你贴的FillProducts方法,你在调用cboProducts.Items.Clear()和Items.Add(),但显然这个cboProducts控件之前已经被设置过DataSource(大概率是在窗体初始化、其他方法里绑定了ProductsTable或其他数据源),这就触发了绑定规则和手动操作Items的冲突。

两种解决思路

思路1:改用手动添加项,先解除数据绑定

如果一定要手动遍历添加ProductListing对象,先把控件的DataSource设为Nothing,断开绑定后再操作Items:

Private Sub FillProducts()
    Dim NRec As Integer
    Call SetStateP("View")
    ' 先清空DataSource,解除绑定
    cboProducts.DataSource = Nothing
    cboProducts.Items.Clear()
    If ProductsTable.Rows.Count <> 0 Then
        For NRec = 0 To ProductsTable.Rows.Count - 1
            cboProducts.Items.Add(ProductListing(ProductsTable.Rows(NRec).Item("ProductID").ToString, ProductsTable.Rows(NRec).Item("Description").ToString, ProductsTable.Rows(NRec).Item("Price").ToString))
        Next NRec
    End If
End Sub

思路2:坚持用数据绑定,直接更新数据源

既然你已经有ProductsTable,直接把它绑定到控件上更简洁,还符合WinForms的设计逻辑,不用手动维护Items:

Private Sub FillProducts()
    Dim NRec As Integer
    Call SetStateP("View")
    ' 直接绑定数据源,控件会自动同步选项
    cboProducts.DataSource = ProductsTable
    cboProducts.DisplayMember = "Description" ' 设置用户看到的显示字段
    cboProducts.ValueMember = "ProductID" ' 设置实际关联的值字段
End Sub

内容的提问来源于stack exchange,提问作者Pc Romanofsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:14:52