none
PASAR DATOS DE UN DATAGRIDVIEW A OTRO USANDO DATASOURCE DE UN FORMULARIO A OTRO RRS feed

  • Pregunta

  • Quisiera saber Cómo puedo hacer para lograr agregar datos de un datagridview a otro, teniendo en cuenta que tengo un formulario Factura y deseo buscar un producto desde un textbox que hace referencia a otro formulario que contiene otro datagridview que éste me devolverá los datos al fomulario factura por medio del datagridview en Factura.

    Tengo algo así:

               

    private void pbBuscarProducto_Click(object sender, EventArgs e)
            {
                FormBuscar_Producto prod = new FormBuscar_Producto(this);
                NegProducto dgv = new NegProducto();
                DataTable tbdatos = new DataTable();

                string Names = txtProducto.Text;

                if (Names.Length >= 3)
                {

                    tbdatos = dgv.BuscarProductos(Names);
                    prod.dgvProducto.DataSource = tbdatos;
                    prod.ShowDialog();
                    prod.dgvProducto.Visible = true;
                }

                else if (Names.Length == 0)
                {
                    prod.dgvProducto.Visible = false;
                }
            }

    AL ABRIR EL OTRO FORMULARIO, ÉSTE ME DEVUELVE LOS DATOS AL DATAGRIDVIEW DEL FORMULARIO FACTURA:

    private void dgvProducto_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                int indice_producto = e.RowIndex, indice_factura = padre.DGV_Factura.Rows.Add();
                padre.DGV_Factura.Rows[indice_factura].Cells[1].Value = productos.Rows[indice_producto]["Nombre_Producto"];
                padre.DGV_Factura.Rows[indice_factura].Cells[2].Value = productos.Rows[indice_producto]["Precio"];
                padre.DGV_Factura.Rows[indice_factura].Cells[0].Value = "X";
            }

    ÉSTE ES MI FORMULARIO AL DEVOLVER LOS DATOS AL DATAGRIDVIEW FACTURA:

    Necesito ayuda, no se si me pude explicar o en que me he equivocado. Mil gracias

    jueves, 26 de diciembre de 2019 22:29

Respuestas

  • Hola Ramiro

    No entendí muy bien el código pero creo que si la idea. 

    El form con el DataGridView de productos debería ser el form padre, y el de la factura, el hijo. Pones el DataGridView de los productos público, y al invocar el form de la factura, en ShowDialog() le pasas this, que sería una referencia al form padre de los productos, y luego en el form factura accedes al DataGridView del form productos así:

    FormProductos owner = (FormProductos)this.Owner;
    
    var algo = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString(); // o lo que sea

    Se accede a los miembros públicos de un form padre mediante la propiedad Owner del form hijo, que contiene una referencia al form padre, que se la pasas con formHijo.ShowDialog(this);

    Saludos

    Pablo

    viernes, 27 de diciembre de 2019 1:17
  • Ah ... 

    El índice de la factura, podría ser una variable de clase que inicie en 0 por cada factura, y la vas incrementando con cada producto que anotas en la factura, y el índice de los productos es el índice del producto (en el DGV de productos) que estas anotando en la factura, que si no te lo sabes, podes poner el código (o algo parecido, o el nombre) y tendrías que tener un método que busque el índice del producto por ese campo

    Para buscar el índice de un producto en su DGV por código, sería así: 

    private int IndiceProducto(string codigo)
    {
        int a;
        for (a = 0; a < dataGridView1.Rows.Count; a++)
            if (dataGridView1.Rows[a].Cells[0].Value.ToString() == codigo) // suponiendo que codigo es el 1er campo
                return a; // retorna el índice
        return -1; // no existe el codigo
    }

    viernes, 27 de diciembre de 2019 17:20
  • Está bien tu respuesta, pero es simple y no lo puedo resolver. En el Datagridview de factura debo de devolver ciertos datos de mi Datagridview de Productos que pertenecen a otro formulario. Yo estoy claro de hacer cambios de padre e hijo, pero necesito el procedimiento de solo pasar esos datos. El ejemplo que te muestro a continuación, lo hago simple, pero ahora a mi Datagridview de Factura?

                padre.lbIdProducto.Text = dgvProducto.CurrentRow.Cells[0].Value.ToString();
                padre.txtProducto.Text = dgvProducto.CurrentRow.Cells[2].Value.ToString();
                padre.txtCodigo.Text = dgvProducto.CurrentRow.Cells[1].Value.ToString();

    GRACIAS

    viernes, 27 de diciembre de 2019 2:13
  • No entiendo lo que me decís ... el form padre es el de productos, y el form hijo es el de factura

    Para asignarle algo del dataGridView del padre al hijo es

    FormProductos owner = (FormProductos)this.Owner;

    dataGridView1.Rows[indice].Cells[0].Value = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString();

    viernes, 27 de diciembre de 2019 2:47
  • dataGridView1.Rows[indice].Cells[0].Value = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString();

    Qué debo escribir en indice?

    viernes, 27 de diciembre de 2019 2:52
  • Digamos que declaro esta funcion:

     private int IndiceProducto(string codigo)
            {
                int a;
                for (a = 0; a < dgvProducto.Rows.Count; a++)
                    if (dgvProducto.Rows[a].Cells[0].Value.ToString() == codigo) // suponiendo que codigo es el 1er campo
                        return a; // retorna el índice
                return -1; // no existe el codigo
            }

    Ahora dentro del evento CellClick del formulario Producto para devolver los datos al formulario Factura:

    FormProductos owner = (FormProductos)this.Owner;

    dataGridViewPRODUCTO.Rows[IndiceProducto].Cells[0].Value = owner.dataGridViewFACTURA.Rows[IndiceProducto].Cells[0].Value.ToString();

    Pero recuerda que el ciclo for es de tipo int, cómo lo arreglamos?

    SI AGREGO ESTE CODIGO, ME DEVUELVE LOS DATOS PERO ME OCUPA EL ESPACIO EN EL BOTON QUE ME BORRA LA FILA SELECCIONADA

    private void dgvProducto_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                foreach (DataGridViewRow row in dgvProducto.SelectedRows)
                {
                    string Nombres = row.Cells[2].Value.ToString();
                    string precio = row.Cells[8].Value.ToString();
                    padre.DGV_Factura.Rows.Add(Nombres, precio);
                }
            }

    viernes, 27 de diciembre de 2019 21:34
  • ESTO ERA TODO LO QUE NECESITABA, TE DOY MIL GRACIAS Tigre Pablito POR TU APOYO:

    private void dgvProducto_CellClick(object sender, DataGridViewCellEventArgs e)
            {

                foreach (DataGridViewRow row in dgvProducto.Rows)
                {
                    DataGridViewRow fila = new DataGridViewRow();
                    fila.CreateCells(padre.DGV_Factura);
                    fila.Cells[2].Value = row.Cells[2].Value;
                    fila.Cells[3].Value = row.Cells[8].Value;
                    padre.DGV_Factura.Rows.Add(fila);
                }
                
            }

    viernes, 27 de diciembre de 2019 22:11

Todas las respuestas

  • Hola , puedes revisar este ejemplo ahí se hace lo que necesitas

    [N-Tier] – Desarrollo en capas - Ejemplo Facturación – Parte 1


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú

    jueves, 26 de diciembre de 2019 23:54
  • Hola Ramiro

    No entendí muy bien el código pero creo que si la idea. 

    El form con el DataGridView de productos debería ser el form padre, y el de la factura, el hijo. Pones el DataGridView de los productos público, y al invocar el form de la factura, en ShowDialog() le pasas this, que sería una referencia al form padre de los productos, y luego en el form factura accedes al DataGridView del form productos así:

    FormProductos owner = (FormProductos)this.Owner;
    
    var algo = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString(); // o lo que sea

    Se accede a los miembros públicos de un form padre mediante la propiedad Owner del form hijo, que contiene una referencia al form padre, que se la pasas con formHijo.ShowDialog(this);

    Saludos

    Pablo

    viernes, 27 de diciembre de 2019 1:17
  • Está bien tu respuesta, pero es simple y no lo puedo resolver. En el Datagridview de factura debo de devolver ciertos datos de mi Datagridview de Productos que pertenecen a otro formulario. Yo estoy claro de hacer cambios de padre e hijo, pero necesito el procedimiento de solo pasar esos datos. El ejemplo que te muestro a continuación, lo hago simple, pero ahora a mi Datagridview de Factura?

                padre.lbIdProducto.Text = dgvProducto.CurrentRow.Cells[0].Value.ToString();
                padre.txtProducto.Text = dgvProducto.CurrentRow.Cells[2].Value.ToString();
                padre.txtCodigo.Text = dgvProducto.CurrentRow.Cells[1].Value.ToString();

    GRACIAS

    viernes, 27 de diciembre de 2019 2:13
  • No entiendo lo que me decís ... el form padre es el de productos, y el form hijo es el de factura

    Para asignarle algo del dataGridView del padre al hijo es

    FormProductos owner = (FormProductos)this.Owner;

    dataGridView1.Rows[indice].Cells[0].Value = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString();

    viernes, 27 de diciembre de 2019 2:47
  • dataGridView1.Rows[indice].Cells[0].Value = owner.dataGridView1.Rows[indice].Cells[0].Value.ToString();

    Qué debo escribir en indice?

    viernes, 27 de diciembre de 2019 2:52
  • Ah ... 

    El índice de la factura, podría ser una variable de clase que inicie en 0 por cada factura, y la vas incrementando con cada producto que anotas en la factura, y el índice de los productos es el índice del producto (en el DGV de productos) que estas anotando en la factura, que si no te lo sabes, podes poner el código (o algo parecido, o el nombre) y tendrías que tener un método que busque el índice del producto por ese campo

    Para buscar el índice de un producto en su DGV por código, sería así: 

    private int IndiceProducto(string codigo)
    {
        int a;
        for (a = 0; a < dataGridView1.Rows.Count; a++)
            if (dataGridView1.Rows[a].Cells[0].Value.ToString() == codigo) // suponiendo que codigo es el 1er campo
                return a; // retorna el índice
        return -1; // no existe el codigo
    }

    viernes, 27 de diciembre de 2019 17:20
  • Digamos que declaro esta funcion:

     private int IndiceProducto(string codigo)
            {
                int a;
                for (a = 0; a < dgvProducto.Rows.Count; a++)
                    if (dgvProducto.Rows[a].Cells[0].Value.ToString() == codigo) // suponiendo que codigo es el 1er campo
                        return a; // retorna el índice
                return -1; // no existe el codigo
            }

    Ahora dentro del evento CellClick del formulario Producto para devolver los datos al formulario Factura:

    FormProductos owner = (FormProductos)this.Owner;

    dataGridViewPRODUCTO.Rows[IndiceProducto].Cells[0].Value = owner.dataGridViewFACTURA.Rows[IndiceProducto].Cells[0].Value.ToString();

    Pero recuerda que el ciclo for es de tipo int, cómo lo arreglamos?

    viernes, 27 de diciembre de 2019 19:38
  • Digamos que declaro esta funcion:

     private int IndiceProducto(string codigo)
            {
                int a;
                for (a = 0; a < dgvProducto.Rows.Count; a++)
                    if (dgvProducto.Rows[a].Cells[0].Value.ToString() == codigo) // suponiendo que codigo es el 1er campo
                        return a; // retorna el índice
                return -1; // no existe el codigo
            }

    Ahora dentro del evento CellClick del formulario Producto para devolver los datos al formulario Factura:

    FormProductos owner = (FormProductos)this.Owner;

    dataGridViewPRODUCTO.Rows[IndiceProducto].Cells[0].Value = owner.dataGridViewFACTURA.Rows[IndiceProducto].Cells[0].Value.ToString();

    Pero recuerda que el ciclo for es de tipo int, cómo lo arreglamos?

    SI AGREGO ESTE CODIGO, ME DEVUELVE LOS DATOS PERO ME OCUPA EL ESPACIO EN EL BOTON QUE ME BORRA LA FILA SELECCIONADA

    private void dgvProducto_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                foreach (DataGridViewRow row in dgvProducto.SelectedRows)
                {
                    string Nombres = row.Cells[2].Value.ToString();
                    string precio = row.Cells[8].Value.ToString();
                    padre.DGV_Factura.Rows.Add(Nombres, precio);
                }
            }

    viernes, 27 de diciembre de 2019 21:34
  • ESTO ERA TODO LO QUE NECESITABA, TE DOY MIL GRACIAS Tigre Pablito POR TU APOYO:

    private void dgvProducto_CellClick(object sender, DataGridViewCellEventArgs e)
            {

                foreach (DataGridViewRow row in dgvProducto.Rows)
                {
                    DataGridViewRow fila = new DataGridViewRow();
                    fila.CreateCells(padre.DGV_Factura);
                    fila.Cells[2].Value = row.Cells[2].Value;
                    fila.Cells[3].Value = row.Cells[8].Value;
                    padre.DGV_Factura.Rows.Add(fila);
                }
                
            }

    viernes, 27 de diciembre de 2019 22:11