如何保存dataGridView更改数据?

时间:2015-12-25 18:06:17

标签: c# winforms entity-framework code-first mvp

我尝试创建数据库应用程序并实现 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);
}

但是,如何保存更改的单元格数据?

3 个答案:

答案 0 :(得分:2)

如果您正在使用连接的实体,作业很简单,您可以在上下文中加载数据,然后将数据绑定到网格并操作数据,并最后调用您加载数据的上下文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();
    }
}

答案 1 :(得分:1)

通常,要使用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课程的名称。根据需要更新属性/类名以匹配您的用例。

答案 2 :(得分:0)

我不是MVP模式的专家,如果基于示例视图了解模型,
然后你可以使用DataGridView.CellEndEdit eventhandler

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
}