none
grilla no selecciona el valor correcto RRS feed

  • Pregunta

  • buenas noches

    señores del foro tengo una consulta tengo una aplicacion que estoy desarrollando c# con sql 2014 el problema que tengo que al buscar un producto en formulario  me deslizo en la grilla que contiene los datos al presionar enter me elige otro producto que no es el que el elige por ejemplo quiero eligir limon 1k  me elige el producto que esta debajo que es la cachantun no se porque me elige otro producto .

    problema no elige el productos que estoy seleccionado con el enter

    private void DgvProductos_KeyPress(object sender, KeyPressEventArgs e)
            {
                try
                {
                    eProducto = new PRODUCTO();
                    eProducto.IdProducto = Convert.ToInt32(DgvProductos[0,DgvProductos.CurrentRow.Index].Value);
                    eProducto.CodigoBarras=DgvProductos[1,DgvProductos.CurrentRow.Index].Value==null ?"":DgvProductos[1,DgvProductos.CurrentRow.Index].Value.ToString();
                    eProducto.NombreProducto = DgvProductos[2,DgvProductos.CurrentRow.Index].Value==null ?"":DgvProductos[2,DgvProductos.CurrentRow.Index].Value.ToString();
                   
                    eProducto.Stock = Convert.ToDecimal(DgvProductos[5,DgvProductos.CurrentRow.Index].Value);
                  
                    
                    if ((eProducto.Stock <= 0) 
                    {
                        MessageBox.Show("No hay stock suficiente para vender", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    PasarProducto(eProducto);
                    Close();
                }


    • Editado djnilo viernes, 2 de noviembre de 2018 3:29
    viernes, 2 de noviembre de 2018 3:29

Respuestas

  • no puedo aplicar el SelectedRows[0]?

    Efectivamente, no puedes, y si relees lo anterior debería ser obvio por qué no puedes: fíjate que por la forma que has descrito lo que haces en el teclado, no estás seleccionando ninguna fila (solo seleccionas una celda de la fila, que no es lo mismo que seleccionar una fila).

    Es peligroso lo de usar el KeyPress y KeyDown en combinación con el Enter, porque puede ser que el sistema esté procesando el Enter y cambiando de fila antes de que se dispare el evento en el que está escrito tu código, en cuyo caso el CurrentRow no sería el que había cuando pulsaste Enter, sino que ya sería la fila siguiente. No sé con seguridad si este es el caso, pero puedes comprobar con el Debugger si eso es lo que pasa.

    • Marcado como respuesta djnilo jueves, 8 de noviembre de 2018 14:03
    domingo, 4 de noviembre de 2018 8:17
    Moderador
  • lo hice de esta forma alberto poblacion gracias por tu paciencia

    con esto me seleciona el producto correcto 

    .CurrentRow.Index - 1]
     try
                {
                    eProducto = new PRODUCTO();
                    eProducto.IdProducto = Convert.ToInt32(DgvProductos[0,DgvProductos.CurrentRow.Index - 1].Value);

    • Marcado como respuesta djnilo jueves, 8 de noviembre de 2018 14:04
    jueves, 8 de noviembre de 2018 14:04

Todas las respuestas

  • Veo que estás usando el "CurrentRow". Fíjate bien no vaya a ser que en realidad lo que necesites sea el SelectedRows[0]. La "fila actual (current)" y la "fila seleccionada (selected)" no tienen por qué ser la misma necesariamente; tal vez ahí esté el problema, dependiendo de cómo hagas la selección. Recomiendo usar el debugger y poner un punto de ruptura en la parte del código donde accedes al grid. Cuando se detenga ahí la ejecución, examina los respectivos valores, a ver qué hay en cada uno, no vaya a ser que el problema venga por esa vía.
    • Propuesto como respuesta Jorge TurradoMVP viernes, 2 de noviembre de 2018 10:30
    • Votado como útil djnilo viernes, 2 de noviembre de 2018 13:59
    • Propuesto como respuesta Pablo RubioModerator viernes, 2 de noviembre de 2018 19:02
    viernes, 2 de noviembre de 2018 7:15
    Moderador
  • hola buenos dias alberto Poblacion  trate de hacerlo como dices con el SelectedRows[0]

    me manda error index 

    lo que necesito al hace seleccionar el productos con el teclado y presionar enter me devuelva el producto correcto que seleccione con el teclado.

    private void DgvProductos_KeyPress(object sender, KeyPressEventArgs e)
            {
                try
                {
                    eProducto = new PRODUCTO();
                    eProducto.IdProducto = Convert.ToInt32(DgvProductos[0,DgvProductos.SelectedRows[0].Index].Value);
                    eProducto.CodigoBarras=DgvProductos[1,DgvProductos.SelectedRows[1].Index].Value==null ?"":DgvProductos[1,DgvProductos.SelectedRows[1].Index].Value.ToString();
                    eProducto.NombreProducto = DgvProductos[2,DgvProductos.SelectedRows[2].Index].Value==null ?"":DgvProductos[2,DgvProductos.SelectedRows[2].Index].Value.ToString();
                    eProducto.Precio = Convert.ToDecimal(DgvProductos[3,DgvProductos.SelectedRows[3].Index].Value);
                   
                    eProducto.Stock = Convert.ToDecimal(DgvProductos[5,DgvProductos.SelectedRows[5].Index].Value);
                    
                  if (eProducto.Stock <= 0)
                   
                    {
                        MessageBox.Show("No hay stock suficiente para vender", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

    viernes, 2 de noviembre de 2018 13:43
  • Puesesta es la forma en que ejecuto


     private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                int index = e.RowIndex;
               nombreproducto = datagridview1[2,index].Value;
            }

    viernes, 2 de noviembre de 2018 16:14
  • Fijate que en el codigo estas llamando a SelectedRows[1] y SelectedRows[2]. Esto dara un error de index a no ser que hayas seleccionado tres filas a la vez en la pantalla. Si solo esta seleccionada una, unicamente puedes llamar al SelectedRows[0]. Y si no esta seleccionada ninguna, dara error de index el SelectedRows[0]. Recuerda que en un grid el teclado permite seleccionar varias filas a la vez, y tambien permite que la fila del cursor ("current") no sea ninguna de las que estan seleccionadas. Por eso te pueden salir distintos valores al acceder al current row y al acceder al selected row, y tambien te puede dar error al acceder al selecterrow[0] si no hay seleccionada ninguna fila (recuerda que no es lo mismo seleccionar una o varias celdas de la fila que seleccionar la fila). Por eso insisto en que uses el debugger y examines los varios datos de seleccion que te ofrece el grid (mira tambien el CurentCell.Row), porque dependiendo de cual sea la forma en que uses el teclado y el raton para seleccionar las cosas puede que no sea el mismo valor el que te devuelven todos esos selectores.
    viernes, 2 de noviembre de 2018 16:31
    Moderador
  • gracias por tu paciencia Alberto Poblacion todavia no he podido solucionar mi problema

    con  la flecha me voy moviendo en la grilla cuando encuentro el producto presiono enter pero me elige el producto que necesito si no que elige el de  abajo no el que elegí. ?

    no puedo aplicar el SelectedRows[0]?

     private void DgvProductos_KeyPress(object sender, KeyPressEventArgs e)
            {
    
    
                if (e.KeyChar == 13)
                   
                try
                {
                        eProducto = new PRODUCTO();
                        eProducto.IdProducto = Convert.ToInt32(DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[0].Value);
                        eProducto.CodigoBarras = (DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[1].Value)== null ? "" : DgvProductos[1, DgvProductos.CurrentRow.Index].Value.ToString();
                        eProducto.NombreProducto = (DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[2].Value) == null ? "" : DgvProductos[2, DgvProductos.CurrentRow.Index].Value.ToString();
                        eProducto.Precio = Convert.ToDecimal(DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[3].Value);
                        eProducto.IdMedida = Convert.ToInt32(DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[4].Value);
                        eProducto.Stock = Convert.ToDecimal(DgvProductos.Rows[DgvProductos.CurrentRow.Index].Cells[5].Value);
             
                        if (eProducto.Stock <= 0)
                       )
                        {
                            MessageBox.Show("No hay stock suficiente para vender", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        PasarProducto(eProducto);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }

    no se si este codigo esta correcto 

      private void FrmBuscarProductos_KeyDown(object sender, KeyEventArgs e)
            {
    
                if (e.KeyCode == Keys.Down)
                {
                    DgvProductos.Focus();
                }
                if (e.KeyCode == Keys.Up)
                {
                    if (DgvProductos.CurrentRow.Index == 0)
                    {
                        TxtBuscar.Focus();
                    }
                }
            }

    sábado, 3 de noviembre de 2018 22:15
  • no puedo aplicar el SelectedRows[0]?

    Efectivamente, no puedes, y si relees lo anterior debería ser obvio por qué no puedes: fíjate que por la forma que has descrito lo que haces en el teclado, no estás seleccionando ninguna fila (solo seleccionas una celda de la fila, que no es lo mismo que seleccionar una fila).

    Es peligroso lo de usar el KeyPress y KeyDown en combinación con el Enter, porque puede ser que el sistema esté procesando el Enter y cambiando de fila antes de que se dispare el evento en el que está escrito tu código, en cuyo caso el CurrentRow no sería el que había cuando pulsaste Enter, sino que ya sería la fila siguiente. No sé con seguridad si este es el caso, pero puedes comprobar con el Debugger si eso es lo que pasa.

    • Marcado como respuesta djnilo jueves, 8 de noviembre de 2018 14:03
    domingo, 4 de noviembre de 2018 8:17
    Moderador
  • lo hice de esta forma alberto poblacion gracias por tu paciencia

    con esto me seleciona el producto correcto 

    .CurrentRow.Index - 1]
     try
                {
                    eProducto = new PRODUCTO();
                    eProducto.IdProducto = Convert.ToInt32(DgvProductos[0,DgvProductos.CurrentRow.Index - 1].Value);

    • Marcado como respuesta djnilo jueves, 8 de noviembre de 2018 14:04
    jueves, 8 de noviembre de 2018 14:04