如何保存数据GridView更改的数据



我正在尝试创建数据库应用程序并实现MVP模式。我使用的是EF+CodeFirst。存在ViewPresenterModel

视图有dataGridViewSetData()方法。

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();
}

断开实体的示例:

我想您已经使用BindingSourceBindingList<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
}

最新更新