如何在C#中为数据源分配数据源时从ListBox中删除所选项目?
尝试删除时,出现错误
“设置DataSource属性时无法修改项目集合。”
但是当我尝试从datasource(datatable)中删除项目时,
它因为“数据行不在当前行集合中”而出现错误。
答案 0 :(得分:9)
在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< T>绑定为您的DataSource。
答案 1 :(得分:2)
或者,使用实现IBindingList的列表或从BindingList继承。在绑定列表中添加或删除对象时,绑定到绑定列表的任何控件都会自动通知更改,并相应地自行更新。如果您正在使用BindingList并且您的类也实现了更改的INotifyProperty,则对类属性的任何更改也将在数据绑定控件中自动更新。例如,如果datagrid(视图)中的列绑定到属性“Name”,并且您更改了数据源中的“Name”,则datagrid将自动更新。如果向数据源添加新项,则datagrid将自动更新。绑定列表还支持另一方向的通知。如果用户在数据网格中编辑“名称”字段,则绑定对象将自动更新。稍微偏离主题,如果你再进一步并且使用“SupportsSortingCore”和BindingList中的相关方法,你可以为你的数据添加自动排序。单击columnm标题将自动对列表进行排序并显示标题排序方向箭头。
答案 2 :(得分:1)
当您收到消息“设置DataSource属性时无法修改项集合。” 将数据源设置为其他内容,空列表或null无效 代码initializecomponent未完成。
为避免该错误,必须在表单加载期间或之后更改数据源或项目列表。
我知道这似乎没有意义。但是,视觉工作室设计者将以designer.cs或vb的形式生成代码,如果在初始化组件结束之前找到更改项目的任何代码,则会将项目添加到列表框中
答案 3 :(得分:0)
如果ListBox分配了数据源,则必须从数据源中删除项目,然后重新绑定ListBox
答案 4 :(得分:0)
您需要修改数据源而不是控件的Items集合。根据您绑定的数据源类型,您必须执行不同的操作才能更新UI。
最好的方法是找到符合您需求的集合,并实现IBindingList或IBindingListView。这两个接口甚至可以实现侦听CollectionChanged事件并相应更新UI的处理程序。
如果您的集合不支持这些接口,那么每次有人添加/删除项目时,您都必须重新绑定数据源。
答案 5 :(得分:0)
它变化简单,为列表框分配一个新的空白值 例如..
Dim ABC As New List(Of String)()
ListBox1.DataSource = ABC
答案 6 :(得分:0)
ListBox实现存在缺陷,您需要为组件创建一个新的数据源实例,以便识别更改。
例如:
ActivitiesList.DataSource = _activities;
_activities = new List<Activity>(_activities);
_activities.Remove((Activity)ActivitiesList.SelectedItem);
ActivitiesList.DataSource = _activities;
答案 7 :(得分:0)
虽然Chris Doggett发布了有效的解决方案,但在使用它时遇到了问题。通过使用该方法,它不允许后续的GetChanges(DataRowState.Deleted)正常工作。
为了更好地解决我的问题,我只需要换一行 - 最后一行。
DataRowView rowView = listBox.SelectedItem as DataRowView;
if (null == rowView)
{
return;
}
rowView.Row.Delete();
这使我的GetChanges调用正常工作。
答案 8 :(得分:0)
这对我有用
DataTable temp = (DataTable)lstBlocks.DataSource;
temp.Rows.RemoveAt(position);