【问题标题】:Entity Framework Datagridview delete strange behaviour实体框架Datagridview删除奇怪行为
【发布时间】:2015-06-11 02:18:12
【问题描述】:

在带有实体框架 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();
    }
    

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

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

【问题讨论】:

  • GetAll 返回什么类型?
  • 它返回 IEnumerable

标签: c# winforms entity-framework datagridview


【解决方案1】:

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

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

解决方案选项

  • 设置DGUser.AllowUserToDeleteRows = false,反正你自己处理,或者...
  • 摆脱DGUser_KeyDown,处理DGUser.UserDeletingRow事件,并在那里调用deleteUser

我可能更喜欢第二个。

【讨论】:

  • 我设置 DGUser.AllowUserToDeleteRows = false 并且它有效。 “摆脱 DGUser_KeyDown,处理 DGUser.UserDeletingRow 事件”是什么意思?
  • 您当前使用的是KeyDown,而您可以改用UserDeletingRow
猜你喜欢
  • 2015-09-07
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多