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
相关产品推荐
相关产品推荐

