从ObservableCollection中删除一行在网格中失败

时间:2014-04-13 10:00:29

标签: c# wpf observablecollection delete-row

删除网格中的一行会导致一个名为“System.InvalidOperationException”的错误。

在我的数据库中成功删除了该行,但是当网格使用我的observable集合时,会发生上述错误。

这是我的代码:

UserControlStaff.xaml.cs

private void deleteUserData_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
            var grid = (DataGrid)sender;
            if (grid.SelectedItems.Count > 0)
            {
                var Res = MessageBox.Show("Are you sure you want to delete " + grid.SelectedItems.Count + " Users?", "Deleting Records", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
                if (Res == MessageBoxResult.Yes)
                {
                    try
                    {
                        string connectionString = ConfigurationManager.ConnectionStrings["MyApp.Properties.Settings.ConString"].ConnectionString;
                        string queryString = string.Empty;

                        using (SqlConnection connection = new SqlConnection(connectionString))
                        {

                            foreach (var row in grid.SelectedItems)
                            {
                                User user = row as User;

                                queryString = "DELETE FROM Users WHERE ID = " + user.ID;
                                SqlCommand cmd = new SqlCommand(queryString, connection);
                                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                                DataTable dt = new DataTable("Users");
                                sda.Fill(dt);

                                mUserDataObject.Remove(user);
                            }

                        }
                    }
                    catch
                    {
                        throw;
                    }

                    MessageBox.Show(grid.SelectedItems.Count + " Users have being deleted!");
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

在您对该集合进行枚举时,无法修改集合。

如果要删除项目,请创建新的列表实例:

foreach (var row in grid.SelectedItems.OfType<User>().ToList())
{
   ...
   mUserDataObject.Remove(user);
}

确保添加 System.Linq 命名空间以使用扩展方法。