如何保存数据GridView更改的数据
本文关键字:数据 GridView 何保存 保存 | 更新日期: 2023-09-27 18:28:06
我正在尝试创建数据库应用程序并实现MVP模式。我使用的是EF+CodeFirst。存在View
、Presenter
和Model
。
视图有dataGridView
和SetData()
方法。
public void SetData(IEnumerable<Goods> items)
{
dataGridView1.DataSource = items.ToList();
}
Presenter从Model中检索数据,并调用View的SetData()。
internal void Select()
{
var data = _modelGoods.Select();
_view.SetData(data);
}
但是,如何保存更改后的单元格数据?
如果您使用的是连接的实体,那么任务很简单,您可以在上下文中加载数据,然后将数据绑定到网格并操作数据,最后调用加载数据的上下文的SaveChanges
,将更改应用到数据库。
如果使用断开连接的实体,则应跟踪实体更改。添加了一些实体,更改了一些实体并删除了一些实体。您希望插入那些添加的实体,更新那些更改的实体,并从上下文中删除那些删除的实体。为此,您可以从BindigList<T>
或ObservableCOllection<T>
继承,也可以使用BindingSource
来侦听列表更改事件,跟踪更改并将更改存储在3个单独的列表中(添加、更改、删除),然后将这些列表传递给服务器以应用更改。
关联实体示例:
SampleDbContext db;
private void Form1_Load(object sender, EventArgs e)
{
db = new SampleDbContext();
db.Products.Load();
this.productDataGridView.DataSource = db.Products.Local.ToBindingList();
}
private void SaveButton_Click(object sender, EventArgs e)
{
this.productDataGridView.EndEdit();
db.SaveChanges();
}
断开实体的示例:
我想您已经使用BindingSource
、BindingList<T>
或ObservableCollection<T>
,甚至使用DataGridView
事件或其他东西跟踪了更改。现在,您应该已经添加、编辑和删除了实体,并且可以将它们传递给服务器代码,以这种方式应用更改:
public void SaveChanges(List<Product> added, List<Product> edited, List<Product> deleted)
{
using (var db = new SampleDbContext())
{
foreach (var entity in deleted)
{
if (edited.Contains(entity))
edited.Remove(entity);
if (added.Contains(entity))
added.Remove(entity);
else
db.Entry(entity).State = EntityState.Deleted;
}
foreach (var entity in added)
{
if (edited.Contains(entity))
edited.Remove(entity);
db.Entry(entity).State = EntityState.Added;
}
foreach (var entity in edited)
db.Entry(entity).State = EntityState.Modified;
db.SaveChanges();
}
}
通常,要使用EF更新记录,首先读取实体对象,用新值更新属性值,然后将其保存回。
像这样的东西。
var idOfRecord=12;
using(var yourDbContext=new YourDbContext())
{
var good=yourDbContext.Goods.FirstOrDefault(s=>s.Id==idOfRecord);
if(good!=null)
{
good.Name = "New name read from UI"; //Updating the Name property value
yourDbContext.Entry(good).State = EntityState.Modified;
yourDbContext.SaveChanges();
}
}
假设YourDbContext
是您的DbContext
类的名称。根据需要更新属性/类名以匹配您的用例。
我不是MVP模式的专家,如果基于examples视图了解模型,
然后可以使用DataGridView.CellEndEdit
事件处理程序
private void dgvtest1_CellEndEdit(Object sender, DataGridViewCellEventArgs e)
{
if(e.RowIndex < 0)
return;
if(e.ColumnIndex < 0)
return;
DataGridView dgv = (DataGridView)sender;
DataGridViewRow row = dgv.Rows(e.RowIndex);
Good model = row.DataBoundItem as Good
if(model == null)
return;
//Then decide which property was changed and update it
String boundPropertyName= dgv.Columns(e.ColumnIndex).DataPropertyName;
if(boundPropertyName.Equals(nameOf(model.SomeProperty)) == true)
{
//Update value
return;
}
//.. other columns
}