[英]How to remove selected items from ListBox when a DataSource is assigned to it in C#?
在 C# 中分配数据源时如何从 ListBox 中删除选定的项目?
尝试删除时出现错误
“设置 DataSource 属性时无法修改项目集合。”
但是当我尝试从数据源(数据表)中删除项目时,
它将错误作为“数据行不在当前行集合中”。
在 DataSource object 中找到该项并将其删除,然后重新绑定 ListBox。
编辑:
无论 .NET 版本如何,这是从 DataTable 中删除作为 DataSource 的方法。
DataRowView rowView = listBox.SelectedItem as DataRowView;
if (null == rowView)
{
return;
}
dt.Rows.Remove(rowView.Row);
除了 WinForms DataGridViews,我没有尝试过其他任何东西,但我强烈推荐BindingListView ,它比 DataTables/Views 更快,并且允许您将通用 List<T>s 绑定为数据源。
或者,使用实现 IBindingList 或从 BindingList 继承的列表。 当从绑定列表中添加或删除对象时,绑定到它的任何控件都会自动收到更改通知,并将相应地更新自己。 如果您正在使用 BindingList 并且您的 class 也实现了 INotifyProperty 更改,则对 class 属性的任何更改也将在数据绑定控件中自动更新。 例如,如果数据网格(视图)中的列绑定到属性“名称”,并且您更改数据源中的“名称”,则数据网格将自动更新。 如果向数据源添加新项目,数据网格将自动更新。 绑定列表还支持另一个方向的通知。 如果用户在数据网格中编辑“名称”字段,绑定的 object 将自动更新。 稍微偏离主题,如果您进一步了解 go 并在 BindingList 中实现“SupportsSortingCore”和相关方法,则可以为您的数据添加自动排序。 单击列 m header 将自动对列表进行排序并显示 header 排序方向箭头。
当您收到消息“设置 DataSource 属性时无法修改项目集合”时。 当代码初始化组件未完成时,将数据源设置为其他内容、空列表或 null 无济于事。
为避免该错误,必须在表单加载期间或之后更改数据源或项目列表。
我知道这似乎没有意义。 然而,如果在初始化组件结束之前发现任何更改项目的代码,Visual Studio 设计器将以 Designer.cs 或 vb 形式生成代码,这些代码会将项目添加到列表框
这对我有用
DataTable temp = (DataTable)lstBlocks.DataSource;
temp.Rows.RemoveAt(position);
ListBox 实现存在错误,您需要为组件创建一个新的数据源实例,以便它识别更改。
例如:
ActivitiesList.DataSource = _activities;
_activities = new List<Activity>(_activities);
_activities.Remove((Activity)ActivitiesList.SelectedItem);
ActivitiesList.DataSource = _activities;
如果 ListBox 分配了数据源,则必须从数据源中删除项目,然后重新绑定 ListBox
您需要修改数据源而不是控件的 Items 集合。 根据您绑定到的数据源类型,您需要执行不同的操作才能更新 UI。
最好的方法是找到一个适合您需要并实现 IBindingList 或 IBindingListView 的集合。 这两个接口甚至实现了侦听 CollectionChanged 事件并相应地更新您的 UI 的处理程序。
如果您的集合不支持这些接口,那么每次有人添加/删除项目时,您都必须重新绑定您的数据源。
虽然 Chris Doggett 发布了一个有效的解决方案,但我在使用它时遇到了问题。 通过使用该方法,它不允许后续的 GetChanges(DataRowState.Deleted) 正常工作。
为了更好地解决我的问题,我只需要更改一行 - 最后一行。
DataRowView rowView = listBox.SelectedItem as DataRowView;
if (null == rowView)
{
return;
}
rowView.Row.Delete();
这允许我的 GetChanges 调用正常工作。
它的变化很简单,为列表框分配一个新的空白值,例如..
将 ABC 调暗为新列表(字符串)()
ListBox1.DataSource = ABC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.