如何在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
或者,使用实现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);