如何在C#中为其分配DataSource时从ListBox中删除所选项?

如何在C#中为数据源分配数据源时从ListBox中删除所选项?

当试图删除时,得到了错误

“设置DataSource属性时,无法修改项集合。”


但是当我尝试从datasource(datatable)中删除项目时,

它因为“datarow不在当前行集合中”而出现错误。

在DataSource对象中找到该项并将其删除,然后重新绑定ListBox。

编辑

以下是从DataTource中删除数据源的方式,无论.NET版本如何。

DataRowView rowView = listBox.SelectedItem as DataRowView; if (null == rowView) { return; } dt.Rows.Remove(rowView.Row); 

我没有尝试过除WinForms DataGridViews以外的任何东西,但我强烈推荐BindingListView ,它比DataTables / Views更快,并允许您将通用List 绑定为您的DataSource。

或者,使用实现IBindingList的列表或从BindingListinheritance。 在绑定列表中添加或删除对象时,绑定到绑定列表的任何控件都会自动通知更改,并相应地自行更新。 如果您正在使用BindingList并且您的类也实现了更改的INotifyProperty,则对类属性的任何更改也将在数据绑定控件中自动更新。 例如,如果datagrid(视图)中的列绑定到属性“Name”,并且您更改了数据源中的“Name”,则datagrid将自动更新。 如果向数据源添加新项,则datagrid将自动更新。 绑定列表还支持另一方向的通知。 如果用户在数据网格中编辑“名称”字段,则绑定对象将自动更新。 稍微谈谈主题,如果你再进一步并且使用“SupportsSortingCore”和BindingList中的相关方法,你可以为你的数据添加自动排序。 单击columnm标题将自动对列表进行排序并显示标题排序方向箭头。

当您收到消息“设置DataSource属性时无法修改项集合。” 将数据源设置为其他内容,空列表或null在代码initializecomponent未完成时没有帮助。

为避免该错误,必须在表单加载期间或之后更改数据源或项目列表。

我知道它似乎没有意义。 但是,视觉工作室设计人员将以designer.cs或vb的forms生成代码,如果在初始化组件结束之前找到更改项目的任何代码,则会将项目添加到列表框中

如果ListBox分配了数据源,则必须从数据源中删除项目,然后重新绑定ListBox

您需要修改数据源而不是控件的Items集合。 根据您绑定的数据源类型,您必须执行不同的操作才能更新UI。

最好的方法是找到一个符合您需求的集合,并实现IBindingList或IBindingListView。 这两个接口甚至可以实现侦听CollectionChanged事件并相应地更新UI的处理程序。

如果您的集合不支持这些接口,那么每次有人添加/删除项目时,您都必须重新绑定数据源。

它变化简单,为列表框分配一个新的空白值,例如..

昏暗的ABC作为新列表(字符串)()

ListBox1.DataSource = ABC

ListBox实现存在缺陷,您需要为组件创建一个新的数据源实例,以便识别更改。

例如:

 ActivitiesList.DataSource = _activities; _activities = new List(_activities); _activities.Remove((Activity)ActivitiesList.SelectedItem); ActivitiesList.DataSource = _activities; 

虽然Chris Doggett发布了一个有效的解决方案,但在使用它时遇到了问题。 通过使用该方法,它不允许后续的GetChanges(DataRowState.Deleted)正常工作。

为了更好地解决我的问题,我只需要改变一行 – 最后一行。

 DataRowView rowView = listBox.SelectedItem as DataRowView; if (null == rowView) { return; } rowView.Row.Delete(); 

这允许我的GetChanges调用正常工作。

这对我有用

  DataTable temp = (DataTable)lstBlocks.DataSource; temp.Rows.RemoveAt(position);