实体框架Datagridview删除奇怪行为

本文关键字:删除 框架 Datagridview 实体 | 更新日期: 2023-09-27 17:55:01

在Windows Forms MDI Application .net 4.0 with Entity Framework 4.4中,我有以下奇怪的行为:

在MDI-Child-Form中是一个datagridview

数据绑定:

private void DGUser_gridBind()
    {
        _users = _frmmaster.DataAdmin.RepositoryAdmin.GetAll<User>();
        DGUser.DataSource = _users;
    }

绑定使用了主表单的上下文。

我希望用户可以通过点击delete按钮或del键来删除实体。

  1. del键

        private void DGUser_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Delete)
        {
            if(DGUser.SelectedRows.Count==1)
            {
                User selectedUser = (User)DGUser.SelectedRows[0].DataBoundItem;
                deleteUser(selectedUser);
            }
        }            
    }
    
  2. 删除按钮

        private void btDeleteUser_Click(object sender, EventArgs e)
    {
        if (DGUser.SelectedRows.Count == 1)
        {
            User selectedUser = (User)DGUser.SelectedRows[0].DataBoundItem;
            deleteUser(selectedUser);
        }
    }
    
  3. 删除功能
        private void deleteUser(User user)
    {
            _frmmaster.DataAdmin.RepositoryAdmin.Delete<User>(user);
            _frmmaster.DataAdmin.RepositoryAdmin.UnitOfWork.SaveChanges();
            DGUser_gridBind();
    }
    

当我通过单击delete按钮删除用户时,它按预期工作但当我使用del-key删除用户时,所选实体将被删除,这很好,但也将删除datagridview中的第一个实体(dgv中的第一个实体仅在Repository中删除,而不是在数据库中删除,所选实体也将在数据库中删除)。当我在存储库的删除函数中设置断点时,它只使用正确的实体激活一次。

我不知道为什么dgv中的第一个实体也被删除了。两个函数都使用相同的delete函数,但结果不同。谁能给我提示一下我的错误在哪里?

实体框架Datagridview删除奇怪行为

默认情况下,当您在聚焦DataGridView时按delete键时,它将从DataGridView和绑定集合中删除该行。但是,您要自己处理KeyDown事件,删除行,并在默认操作发生之前更新DGUser.DataSource。以下是动作的顺序(我认为):

  1. 用户按删除键
  2. deleteUser从数据库中删除选定行
  3. DGUser是反弹和更新
  4. DgUser处理默认的删除键动作(可能在KeyUp上?)并删除选定的行,这显然现在是重新绑定后的第一行

解决方案选择

  • 设置DGUser.AllowUserToDeleteRows = false,因为你自己处理它,或者…
  • 去掉DGUser_KeyDown,处理DGUser.UserDeletingRow事件,在那里调用deleteUser

我可能更喜欢第二个。