如何保存dataGridView改变的数据?
How to save dataGridView changed data?
我正在尝试创建数据库应用程序并实施 MVP 模式。
我正在使用 EF+CodeFirst。
有 View
、Presenter
和 Model
。
视图有 dataGridView
和 SetData()
方法。
public void SetData(IEnumerable<Goods> items)
{
dataGridView1.DataSource = items.ToList();
}
Presenter 从模型中检索数据并调用视图的 SetData()。
internal void Select()
{
var data = _modelGoods.Select();
_view.SetData(data);
}
但是,如何保存更改的单元格数据?
通常,要使用 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
class 的名字。根据需要更新 property/class 名称以匹配您的用例。
如果您使用连接的实体,工作很简单,您可以在上下文中加载数据,然后将数据绑定到网格并操作数据,最后调用 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();
}
}
我不是MVP模式的专家,如果基于示例视图了解模型,
那么你可以使用 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
}
我正在尝试创建数据库应用程序并实施 MVP 模式。
我正在使用 EF+CodeFirst。
有 View
、Presenter
和 Model
。
视图有 dataGridView
和 SetData()
方法。
public void SetData(IEnumerable<Goods> items)
{
dataGridView1.DataSource = items.ToList();
}
Presenter 从模型中检索数据并调用视图的 SetData()。
internal void Select()
{
var data = _modelGoods.Select();
_view.SetData(data);
}
但是,如何保存更改的单元格数据?
通常,要使用 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
class 的名字。根据需要更新 property/class 名称以匹配您的用例。
如果您使用连接的实体,工作很简单,您可以在上下文中加载数据,然后将数据绑定到网格并操作数据,最后调用 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();
}
}
我不是MVP模式的专家,如果基于示例视图了解模型,
那么你可以使用 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
}