实体框架:C#Winforms bindingsource在datagridview上删除,但标记isDeleted字段仅为true(不删除)
我目前正在使用Entity Framework 5开发一个C#Winforms应用程序 我的问题是如何对绑定到实体框架:C#Winforms bindingsource在datagridview上删除,但标记isDeleted字段仅为true(不删除),c#,winforms,entity-framework,datagridview,bindingsource,C#,Winforms,Entity Framework,Datagridview,Bindingsource,我目前正在使用Entity Framework 5开发一个C#Winforms应用程序 我的问题是如何对绑定到实体的bindingsource上的项目执行删除(仅将字段标记为true) 这是我表格的截图: DataGridView绑定到enrollmedsBindingSource。请参阅填充绑定源的表单加载代码: private void EnrollMedicationFrm_Load(object sender, EventArgs e) { contex
实体的bindingsource
上的项目执行删除(仅将字段标记为true
)
这是我表格的截图:
DataGridView
绑定到enrollmedsBindingSource
。请参阅填充绑定源的表单加载代码:
private void EnrollMedicationFrm_Load(object sender, EventArgs e)
{
context.enrollmeds.Where(adm => adm.FK_Admission == _SelectedPKAdm && adm.isDeleted == false).ToList();
enrollmedsBindingSource.DataSource = context.enrollmeds.Local;
}
正如您在上面的代码中所看到的,我过滤了数据以仅显示isDeleted
设置为false的数据
下面是“我的删除”按钮的代码:
private void DeleteBtn_Click(object sender, EventArgs e)
{
if (enrollmedsDataGridView.CurrentRow == null)
{
MessageBox.Show("No item selected.", "System Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
enrollmedsBindingSource.Remove(enrollmedsBindingSource.Current);
}
}
如果调用context.SaveChanges(),此代码将从数据库中删除该项代码>保存按钮
下面是保存按钮的代码:
private void SaveBtn_Click(object sender, EventArgs e)
{
this.enrollmedsBindingSource.EndEdit();
context.enrollmeds.Local
.Where(a => a.C__PK_EnrollMeds == 0)
.ToList().ForEach(i =>
{
i.FK_DC_Patient = pxdetails.pxDC.PK_Datacenter;
i.FK_DC_userAdd = mainfrm.PK_DC_UserLoggedIn;
i.AddDateTime = currdatetime;
i.FK_Admission = pxdetails.adm.PK_Admission;
});
this.context.SaveChanges();
enrollmedsDataGridView.Refresh();
this.Dispose();
}
我想做的是删除DataGridView
(从用户视图中)上的条目,但仅标记数据库中isDeleted
字段为true
(用于审计目的)
注意:
保存按钮仅在用户完成所有更改后单击,因此表单需要捕获在保存时删除(isDeleted
)、更改和添加的内容。您应该将实体的isDeleted
属性设置为true
,并调用SaveChanges
。例如,如果您有一个产品
实体:
var p = (Product)bindingSource.Current;
p.IsDeleted = true;
db.SaveChanges();
然后,如果不打算重新加载数据,则可以从列表中删除该项以不显示该项:
bs.RemoveCurrent();
db.Entry(p).State = EntityState.Detached;
或者,您可以重新加载数据:
db.Products.Where(x => x.IsDeleted == false).Load();
bindingSource.DataSource = db.Products.Local;
注意
如果不打算立即保存更改,则需要在将IsDeletet
设置为true
后执行其他操作:
- 您可以停止连接到上下文的工作,使用or进行数据绑定,并自己跟踪数据更改。然后,您只需拥有一个已删除项目列表,以便在保存更改时将其
IsDeleted
属性设置为true
- 另一个选项是,将
isdeletd
设置为true后,可以在DataGridView
中更改已删除行的外观。例如,您可以处理DataGridView
的RowPostPaint
事件,并在行上绘制一个红色的删除线
您需要将IsDeleted
设置为true
然后SaveChanges
然后重新加载数据。您好@Reza,谢谢您回答我的问题。尝试了您的答案,但未按mydb.SaveChanges()工作代码>仅在保存按钮上调用,该按钮仅在用户完成更改后单击。我认为db.Entry(p.State=EntityState.Detached代码>代码会丢失对实体更改的跟踪,这就是为什么在保存时不会保存任何更改。如果我删除db.Entry(p).State=EntityState.Detached代码>项目将被删除:(非常感谢兄弟@Reza:)您好,欢迎:)db.Entry(p.State=EntityState.Detached
将分离实体,而上下文将不再跟踪实体。您好@Reza,您在entityframework上有什么解决方法可以这样做吗?我对此不知所措:(我知道绑定将处理实体上的更改,前提是有办法避开绑定上的删除部分,这样我就可以对删除的项进行单独的处理(isDeleted
)。作为一种解决方法,我更喜欢以不同的方式呈现已删除的项目,例如更改颜色、背景色,甚至在其上绘制删除线。保存更改后,重新加载数据以将其从网格中删除。非常感谢@Reza,您给了我解决方法的想法:)而不是更改背景色或删除行,我把行隐藏起来,它工作了:)该行仍然在绑定上(不会被删除),但是它对用户是隐藏的(就像我希望发生的那样)。再次感谢你的高超技巧:)我将把你的解决方案标记为答案:)再次感谢兄弟:):)