实体框架Datagridview删除奇怪的行为

时间:2015-06-11 02:18:13

标签: c# winforms entity-framework datagridview

在带有Entity Framework 4.4的Windows窗体MDI应用程序.net 4.0中,我有以下奇怪的行为:

在MDI-Child-Form中是datagridview

数据绑定:

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

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

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

  1. 德尔键

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

    我无法找出为什么dgv中的第一个实体也被删除了。两个函数都使用相同的删除功能,但结果不同。任何人都可以给我一个提示,在哪里寻找我的错误。

1 个答案:

答案 0 :(得分:2)

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

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

    • 设置DGUser.AllowUserToDeleteRows = false,因为您无论如何都要自己处理,或者......
    • 摆脱DGUser_KeyDown,处理DGUser.UserDeletingRow事件,然后致电deleteUser

    我可能更喜欢第二种。