簡體   English   中英

在 C# 中為 ListBox 分配數據源時,如何從 ListBox 中刪除所選項目?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM