Saltar a contenido


Foto

Problemilla con Datagridview en Visual Basic


  • Debes iniciar sesión para poder participar
2 respuestas en este hilo

#1 Chaos_Hedgehog

Chaos_Hedgehog
  • Reikainiano
  • 589 mensajes

Publicado 30 November 2011 - 03:01 PM

A ver si me explico bien. Me han encargado en la empresa un programa de facturación online, el cuál estoy desarrollando en Visual Basic. Tengo una ventana donde gestiono los datos de los presupuestos que se le realizan a los proveedores, en la cual incluyo una tabla (un Datagridview enlazado a datos) donde gestiono los productos listados en cada presupuesto.

Tengo un código montado para que, cuando introduzca un código del producto en la primera columna, el programa busque dicho código en la tabla correspondiente de la base de datos y, en caso de encontrarlo, cargue la fila donde me encuentro con los datos propicios. Y aquí es donde llegamos al problema.

Quiero que, una vez que cargue los datos, salte a la columna correspondiente a la cantidad, y después de rellenar dicho campo, salte a la columna correspondiente al descuento aplicado. Pero como he construido el programa de tal forma que cargue los datos al validar una celda, si quiero cambiar la celda en tiempo de ejecución me dispara el evento CellValidated y, o bien me monta un bucle infinito de narices, o bien me manda a una celda distinta a la que me interesa.

He intentado establecer la propiedad CausesValidation del Datagridview en False para que no me dispare el evento de validación, pero se ve que no impide que salte el CellValidated. ¿Hay alguna forma de impedir que se ejecute el mencionado evento al pasar de una celda a otra?
Imagen subida

#2 xose

xose

    Administrator

  • Administradores
  • 7701 mensajes

Publicado 30 November 2011 - 03:48 PM

Tienes que utilizar el parámetro DataGridViewCellEventArgs del evento para distinguir si necesitas hacer algo o no. ColumnIndex y RowIndex te indican la celda que se ha validado.

Si no es suficiente, puedes hacer una pequeña máquina de estados, con un booleano o un enum. Ejemplo (en pseudocódigo, que no sé VB):

class Formulario {
    private boolean cargando = false;
    
    onCellValidated(sender, e) {
        if (cargando == true)
            return; // saltarse el evento
        
        if (e.ColumnIndex == 2) { // la columna que carga los datos
            cargando = true;
            carga_datos();
            cargando = false;
        }
    }
}

Reikai-firma.gif


#3 Chaos_Hedgehog

Chaos_Hedgehog
  • Reikainiano
  • 589 mensajes

Publicado 30 November 2011 - 11:02 PM

Muchas gracias xose, lo que has puesto en pseudocódigo me ha venido bastante bien para poder atajar el problema. Ahora solo me queda hacerle unos ajustes al código para dejarlo perfecto.
Imagen subida




0 usuario(s) está(n) leyendo este hilo

0 miembros, 0 visitantes, 0 usuarios anónimos