实体框架:C#Winforms在datagridview上删除了绑定源,但是将isDeleted字段标记为仅true(不删除)

Hen*_*nry 4 c# entity-framework datagridview bindingsource winforms

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

我的问题是如何对绑定到的项目进行删除(仅将isDeleted字段标记为true)。bindingsourceentity

这是我的表单的屏幕截图:

登记药物表格

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;
    }
Run Code Online (Sandbox Code Playgroud)

如您在上面的代码中看到的,我过滤了数据以仅显示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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我调用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();
    }
Run Code Online (Sandbox Code Playgroud)

我想做的是DataGridView (从用户的角度)删除(从用户的角度)上的条目,但是仅标记isDeleted字段true在数据库中(出于审计目的)

注意: 仅当用户完成所有更改后,才单击“保存”按钮,因此该表单需要捕获isDeleted在保存时删除(),更改和添加的内容。

Rez*_*aei 5

您应该将IsDeleted实体的属性设置为trueSaveChanges。例如,如果您有一个Product实体:

var p = (Product)bindingSource.Current;
p.IsDeleted = true;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

然后,如果您不打算重新加载数据,则可以从列表中删除该项目以不显示它:

bs.RemoveCurrent();
db.Entry(p).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)

或者您可以重新加载数据:

db.Products.Where(x => x.IsDeleted == false).Load();
bindingSource.DataSource = db.Products.Local;
Run Code Online (Sandbox Code Playgroud)

注意

如果您不打算立即保存更改,则需要在设置IsDeletet为之后执行其他操作true

  • 您可以停止连接上下文,并使用BindingList<T>ObservableCollection<T>进行数据绑定并自己跟踪数据更改。然后,您只需拥有一个已删除项目的列表,IsDeleted即可true在保存更改时将其属性设置为。

  • 另一种选择是,设置IsDeleetd为true后,您可以在中更改已删除行的外观DataGridView。例如,您可以处理的RowPostPaint事件DataGridView并像在行上方绘制一个红色的删除线。