Entity Framework: C# Winforms bindingsource 在 datagridview 上删除,但仅将 isDeleted 字段标记为 true(不删除)
Entity Framework: C# Winforms bindingsource delete on datagridview, but tag isDeleted field as true only (not delete)
我目前正在使用 Entity Framework 5.
开发 C# Winforms 应用程序
我的问题是如何删除(仅将 isDeleted
字段标记为 true
)到绑定到 entity
的 bindingsource
上的项目。
这是我的表格截图:
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
。例如,如果您有一个 Product
实体:
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
后执行其他操作:
您可以停止连接到上下文并使用 BindingList<T>
or ObservableCollection<T>
作为 data-binding 并自行跟踪数据变化。然后您可以简单地拥有一个已删除项目的列表,以便在保存更改时将它们的 IsDeleted
属性 设置为 true
。
作为另一种选择,将IsDeleetd
设置为true后,您可以更改DataGridView
中已删除行的外观。例如,您可以处理 DataGridView
的 RowPostPaint
事件并在该行上方绘制红色删除线。
我目前正在使用 Entity Framework 5.
开发 C# Winforms 应用程序我的问题是如何删除(仅将 isDeleted
字段标记为 true
)到绑定到 entity
的 bindingsource
上的项目。
这是我的表格截图:
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
。例如,如果您有一个 Product
实体:
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
后执行其他操作:
您可以停止连接到上下文并使用
BindingList<T>
orObservableCollection<T>
作为 data-binding 并自行跟踪数据变化。然后您可以简单地拥有一个已删除项目的列表,以便在保存更改时将它们的IsDeleted
属性 设置为true
。作为另一种选择,将
IsDeleetd
设置为true后,您可以更改DataGridView
中已删除行的外观。例如,您可以处理DataGridView
的RowPostPaint
事件并在该行上方绘制红色删除线。