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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top