Maestro – Detalle

En esta oportunidad vamos a realizar una app Maestro – Detalle, usando dos DataGridView, ADO.NET y LINQ to DataSet.

Vamos a trabajar con la DB Northwind, tablas Customers(Maestro) y Orders(Detalle), tenemos que fijarnos el campo en común que tienen estas dos tablas que en le Maestro es el PK y en el Detalle es el FK, por esos campos es que relacionamos ambas tablas.

public class CustomersOrdersRepository
    {
        public static DataSet MaestroDetalle()
        {
            // Agregamos la key que define al config
            using (SqlCeConnection cn = Conexion.Conectar("NorthwindConnectionString"))
            {
                cn.Open();
                using (SqlCeCommand cmd = cn.CreateCommand())
                {
                    cmd.CommandText = "SELECT [Customer ID], [Company Name], City, Country FROM Customers";
                    using (SqlCeDataAdapter da = new SqlCeDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        // Llenar DataTable en el DataSet
                        da.Fill(ds, "Customers");
                        cmd.CommandText = "SELECT [Order ID], [Customer ID], [Employee ID], [Order Date]," +
                                          " [Required Date] FROM Orders";
                        da.Fill(ds, "Orders");

                        // Establecer relaiones
                        DataColumn colPadre = ds.Tables["Customers"].Columns["Customer ID"];
                        DataColumn colHijo = ds.Tables["Orders"].Columns["Customer ID"];
                        DataRelation relation = new DataRelation("Detalle de Pedidos", colPadre, colHijo);
                        ds.Relations.Add(relation);

                        return ds;
                    }
                }

            }
        }
    }

 

Llamaremos al método MaestroDetalle desde el Load del formulario frmMaestroDetalle, para esto vamos a declarar dos variables a nivel de formulario ds y código, para ser llamadas desde cualquier parte del formulario para nuestros propósitos.

public partial class frmMaestroDetalle : Form
    {
        // Declaramos variables a nivel de formulario
        DataSet ds = new DataSet();
        private string codigo;

        public frmMaestroDetalle()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CargarGrillas();
        }

        private void dgvMaestro_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            ObtenerID();
            // Aplicamos las bondades de LINQ to DataSet.
            DataTable DetalleItem = ds.Tables["Orders"];
            EnumerableRowCollection<datarow> query = from _detalle in DetalleItem.AsEnumerable()
                                                     where _detalle.Field<string>("Customer ID") == codigo
                                                     select _detalle;
            DataView view = query.AsDataView();
            dgvDetalle.DataSource = view;

        }

        private  void CargarGrillas()
        {
            // Le asignamos al DataSet el método que hace la consula a la DB.
            ds = CustomersOrdersRepository.MaestroDetalle();
            dgvMaestro.DataSource = ds;
            dgvMaestro.DataMember = "Customers";

            dgvDetalle.DataSource = ds;
            dgvDetalle.DataMember = "Orders";
        }

       private void ObtenerID()
       {
           codigo = Convert.ToString(dgvMaestro.CurrentRow.Cells[0].Value);
       }

    }

Para poder cargar los datos en las grillas estoy creando un método de nombre CargarGrillas, el cual lo llamo en el evento Load. En el cual utilizo la variable ds que esta declarada a nivel del formulario para poder ser llamada desde cualquier lado que se le necesite, a la variable ds nos representa un DataSet, le asignamos el método MaestroDetalle que es el encargado de hacer la persistencia contra la DB y traernos los datos solicitados de Maestro y Detalle, una vez que el DataSet tiene los datos solicitados, se lo asignamos al DataSource del DataGridView, utilizamos el DataMember para darle el nombre de la tabla en este caso como estamos trabajando con la grilla de Maestro le ponemos el nombre “Customers”, de igual manera hacemos para Detalle.

Hasta allí ya tenemos cargadas las dos grillas, ahora vamos a trabajar en el evento dgvMaestro_CellClick del DataGridView, para poder hacer el filtro, en el cual llamamos al método ObtenerID el cual nos obtiene la primera posición de una fila, obteniendo la clave del campo en comúm, teniendo el código hacemos el filtro mediante LINQ to DataSet.

El resultado final que debemos de obtener es como muestra la imagen.

MaestroDetalle

Descargar Proyecto C#

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s