Confirmar cambios después de la edición de DataGridView usando LINQ2SQL (Winforms)
-
06-07-2019 - |
Pregunta
Dado un DataGridView que tiene un BindingSource configurado como este:
En un winform, agregamos un objeto BindingSource usando el diseñador, llamado myBindingScource.Luego, en Form.Designer.cs agregamos esto a InitializeComponents()
myBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram
Posteriormente, en el propio formulario hacemos:
myDataView.DataSource = myBindingSource;
y luego tenemos un método que llena el Grid...
using ( myDataContext mdc = new MyDataContext() )
{
myDataView.DataSource = from per in mdc.person
select per;
}
Como nota al margen, configuré las columnas en Tiempo de diseño y todo se muestra bien.Dado que LINQ 2 SQL no devuelve un anónimo, "myDataView" es editable, y aquí viene la pregunta...
La pregunta es: ¿Cómo persisto en esos cambios?
Hay docenas de eventos en el datagrid y no estoy seguro de cuál es más apropiado.Incluso si pruebo uno de los eventos, todavía no sé cuál es el código que necesito ejecutar para enviar esos cambios a la base de datos para que los cambios persistan.
Recuerdo que en los días de ADO.NET DataSet, hacías dataadapter.Update(dataset);
También imagine que tanto recovery como persist() están en una capa empresarial y la firma del método se ve así:
public void LoadMyDataGrid(DataGridView grid);
ese método toma la cuadrícula del formulario y la completa usando la consulta LINQ2SQL que se muestra arriba.
Ahora me gustaría crear un método como este:
public void SaveMyDataGrid(DataGridView grid); // or similar
La idea es que este método no esté en la misma clase (formulario), muchos ejemplos tienden a asumir que todo está junto.
Solución
El evento RowValidated sería un buen lugar para verificar si es hora de persistir los cambios en la base de datos.
this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowValidated);
private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
MyLinq.Person person = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyLinq.Person;
if (person != null)
{
// save this person back to data access layer
}
}
Después de tu edición:
No devolvería una instancia de datagrid a su capa de servicio.volvería a pasar IEnumerable<MyLinq.Person>
o IList<MyLinq.Person>
luego itere sobre la colección en su capa de servicio, y dependiendo de la lógica realizada;persistir los cambios en la capa de acceso a datos (su base de datos)
Otros consejos
El método 'guardar' en el objeto DataContext es SubmitChanges()
.
using (MyContext c = new MyContext())
{
var q = (from p in c.People
where p.Id == 1
select p).First();
q.FirstName = "Mark";
c.SubmitChanges();
}
Como mencionó Michael G, deberá recopilar los cambios y devolverlos al objeto bll.