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

时间:2009-04-02 12:44:52

标签: c#

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

尝试删除时,出现错误

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


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

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

9 个答案:

答案 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);