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