实体框架:C#Winforms bindingsource在datagridview上删除,但标记isDeleted字段仅为true(不删除)

实体框架: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

我目前正在使用Entity Framework 5开发一个C#Winforms应用程序

我的问题是如何对绑定到
实体的
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,谢谢您回答我的问题。尝试了您的答案,但未按my
db.SaveChanges()工作仅在保存按钮上调用,该按钮仅在用户完成更改后单击。我认为
db.Entry(p.State=EntityState.Detached代码会丢失对实体更改的跟踪,这就是为什么在保存时不会保存任何更改。如果我删除
db.Entry(p).State=EntityState.Detached项目将被删除:(非常感谢兄弟@Reza:)您好,欢迎:)
db.Entry(p.State=EntityState.Detached
将分离实体,而上下文将不再跟踪实体。您好@Reza,您在entityframework上有什么解决方法可以这样做吗?我对此不知所措:(我知道绑定将处理实体上的更改,前提是有办法避开绑定上的删除部分,这样我就可以对删除的项进行单独的处理(
isDeleted
)。作为一种解决方法,我更喜欢以不同的方式呈现已删除的项目,例如更改颜色、背景色,甚至在其上绘制删除线。保存更改后,重新加载数据以将其从网格中删除。非常感谢@Reza,您给了我解决方法的想法:)而不是更改背景色或删除行,我把行隐藏起来,它工作了:)该行仍然在绑定上(不会被删除),但是它对用户是隐藏的(就像我希望发生的那样)。再次感谢你的高超技巧:)我将把你的解决方案标记为答案:)再次感谢兄弟:):)