在带有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;
}
绑定正在使用主表单的上下文。
我希望用户可以通过单击删除按钮或删除键来删除实体。
德尔键
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();
}
当我通过单击删除按钮删除用户时,它按预期工作 但 当我通过使用del-key删除用户时,所选实体将被删除,这很好,但也会删除datagridview中的第一个实体(dgv中的第一个实体只在存储库中删除,而不是在数据库,所选实体也在数据库中删除)。当我在存储库的delete-function中设置断点时,它只会使用正确的实体激活一次。
我无法找出为什么dgv中的第一个实体也被删除了。两个函数都使用相同的删除功能,但结果不同。任何人都可以给我一个提示,在哪里寻找我的错误。
答案 0 :(得分:2)
默认情况下,当您在关注DataGridView
时点击删除键时,它会从DataGridView
和绑定集合中删除该行。但是,您自己处理KeyDown
事件,删除行,并在默认操作发生之前更新DGUser.DataSource
。这是行动的顺序(我认为):
deleteUser
从数据库中删除选定的行DGUser
正在反弹并更新DgUser
处理默认删除键操作(可能在KeyUp上?)并删除所选行,显然现在是重新绑定后的第一行DGUser.AllowUserToDeleteRows = false
,因为您无论如何都要自己处理,或者...... DGUser_KeyDown
,处理DGUser.UserDeletingRow
事件,然后致电deleteUser
我可能更喜欢第二种。