2015-12-25 7 views
0

Я пытаюсь создать приложение базы данных и реализовать MVP pattern. Я использую EF + CodeFirst. Существует View, Presenter и Model.Как сохранить данные DataGridView для изменения данных?

Просмотреть dataGridView и SetData() способ.

public void SetData(IEnumerable<Goods> items) 
{ 
    dataGridView1.DataSource = items.ToList(); 
} 

Ведущий извлекает данные из модели и вызывает SetData() of View.

internal void Select() 
{ 
    var data = _modelGoods.Select(); 
    _view.SetData(data); 
} 

Но как сохранить измененные данные ячейки?

+1

Если вы работаете с отключенными лицами, вы должны отслеживать изменения сущности. Некоторые из ваших сущностей добавлены, некоторые из них изменены, а некоторые из них удалены. И вы хотите вставить эти добавленные объекты и обновить эти измененные сущности и удалить эти удаленные объекты из контекста. –

+0

@RezaAghaei Это называется отключенным сценарием? –

+0

Если вы получаете данные с помощью службы и у вас нет доступа к контексту, из которого вы получаете данные, то это отключается. Например, в связанном сценарии вы создаете экземпляр контекста в своей форме и получаете данные и обрабатываете данные, а затем сохраняете изменения в контексте. –

ответ

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 класса. Обновите имена свойств/классов по мере необходимости, чтобы соответствовать вашему варианту использования.

+0

Как я знаю, какая именно ячейка была изменена - имя или что-то еще? –

+0

Извините! Я не уверен. Не эксперт по winform. Но я думаю, вы должны иметь возможность передать уникальный код обратно в свой код, чтобы отслеживать это. Мой ответ объяснял, как обычно обновление данных работает в EF. – Shyju

2

Если вы работаете с подключенными объектами, задание прост, вы можете загружать данные в контекст, а затем привязывать данные к сетке и манипулировать данными и последним вызовом SaveChanges контекста, в котором вы загружали данные, применять изменения к база данных.

Если вы работаете с отключенными объектами, вы должны отслеживать изменения сущностей. Некоторые из ваших сущностей добавлены, некоторые из них изменены, а некоторые из них удалены. И вы хотите вставить эти добавленные объекты и обновить эти измененные сущности и удалить эти удаленные объекты из контекста. Для этого вы можете наследовать от BindigList<T> или или использовать BindingSource и прослушивать список изменений событий и отслеживать изменения и сохранять изменения в 3 отдельных списках (добавленные, измененные, удаленные), а затем передавать эти списки на сервер для применения изменений ,

Образец для Connected лиц:

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

Образец для Disconnected лиц:

Я полагаю, вы проследили изменения с помощью 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(); 
    } 
} 
+0

Отключенный подход выглядит очень страшно. Но в [this] (http://www.entityframeworktutorial.net/EntityFramework5/attach-disconnected-entity-graph.aspx) ничего не говорится об отслеживании изменений. Где я не могу больше узнать об этом? –

+0

Я не сказал, что это хороший подход, но это очень простой подход для приложений, которые могут работать, и я не уверен, что вы работаете отключен или подключен. Также я считаю, что образец является хорошим примером того, как работать, и будет полезен будущим читателям :) –

+0

Также добавлен пример сохранения отключенных данных. –

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 
} 
Смежные вопросы