【问题标题】:Deleting from an ObservableCollection from a DataGrid从 DataGrid 中的 ObservableCollection 中删除
【发布时间】:2015-08-06 15:33:18
【问题描述】:

我正在制作 WPF 应用程序,目前我无法使用 DataGrid 中的选定项目从 ObservableCollection 中删除项目。 DataGrid 使用 ObservableCollection 作为其 ItemsSource。在我开始对列进行排序之前,我做了一些似乎可以工作的东西:

    Private Sub confirmDelete()
    Dim userAnswer As MessageBoxResult
    userAnswer = MessageBox.Show("Are you sure?", "Delete Selected Items?", MessageBoxButton.YesNo)
    If userAnswer = MessageBoxResult.Yes Then
        Dim index As Integer
        For i As Integer = grdReadings.SelectedItems.Count - 1 To 0 Step -1 'step backwards through list
            index = grdReadings.Items.IndexOf(grdReadings.SelectedItems(i))
            testDataList.RemoveAt(index)
        Next
    End If
End Sub

因此,如果我从不按 DataGrid 中的任何列进行排序,这可以正常工作,但是一旦我以与添加项不同的顺序对 DataGrid 进行排序,DataGrid 中选定项的索引就会不匹配这些项目在 ObservableCollection 中的索引。有没有更好/更简单的方法来使用用户在 DataGrid 中选择的项目从 ObservableCollection 中删除项目?

【问题讨论】:

  • 而不是使用索引 Cast 将行对象添加到它的基础类型,然后从集合中删除该对象。
  • 我尝试做For Each item In grdReadings.SelectedItems Dim removeRow As CCReading = CType(item, CCReading) testDataList.Remove(removeRow) Next,这返回了与以下相同的错误:集合已修改;枚举操作可能无法执行。
  • 调试一下,item 显示什么?
  • item 的值为{Cap_Check.CCReading},removeRow 的值为{Cap_Check.CCReading}。
  • collectionChanged 事件会因此触发吗?

标签: wpf vb.net datagrid


【解决方案1】:

不用查找索引,可以直接删除项目

Private Sub confirmDelete()
    Dim userAnswer As MessageBoxResult
    userAnswer = MessageBox.Show("Are you sure?", "Delete Selected Items?", MessageBoxButton.YesNo)
    If userAnswer = MessageBoxResult.Yes Then
        For each item in grdReadings.SelectedItems
            testDataList.Remove(item)
        Next
    End If
End Sub

【讨论】:

  • 如果循环中的内容修改了集合,For Each 将无法对集合起作用。此代码给出以下错误:An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll Additional information: Collection was modified; enumeration operation may not execute.
【解决方案2】:

这就是我所做的:

        Dim itemsToRemove As New List(Of CCReading)
        For Each item In grdReadings.SelectedItems
            itemsToRemove.Add(item)
        Next
        For Each item In itemsToRemove
            testDataList.Remove(item)
        Next
        itemsToRemove.Clear()

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多