实体框架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键来删除实体。
-
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); } } }
-
删除按钮
private void btDeleteUser_Click(object sender, EventArgs e) { if (DGUser.SelectedRows.Count == 1) { User selectedUser = (User)DGUser.SelectedRows[0].DataBoundItem; deleteUser(selectedUser); } }
-
删除功能
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
时按delete键时,它将从DataGridView
和绑定集合中删除该行。但是,您要自己处理KeyDown
事件,删除行,并在默认操作发生之前更新DGUser.DataSource
。以下是动作的顺序(我认为):
- 用户按删除键
-
deleteUser
从数据库中删除选定行 -
DGUser
是反弹和更新 -
DgUser
处理默认的删除键动作(可能在KeyUp上?)并删除选定的行,这显然现在是重新绑定后的第一行
解决方案选择
- 设置
DGUser.AllowUserToDeleteRows = false
,因为你自己处理它,或者… - 去掉
DGUser_KeyDown
,处理DGUser.UserDeletingRow
事件,在那里调用deleteUser
我可能更喜欢第二个。