Validaciones

Iniciado por piwi, 5 Julio 2010, 20:58 PM

0 Miembros y 1 Visitante están viendo este tema.

piwi

Gracias por las respuestas.

Pero al final hay alguna manera de no permitir al usuario abandonar una celda en caso que no cumpla la condición como por ejemplo un campo que tenga que rellenarlo?

43H4FH44H45H4CH49H56H45H

Bueno este modo es "cutre", pero puedes mejorarlo:

Código (csharp) [Seleccionar]
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                string pru = dataGridView1.Rows[0].Cells[0].Value.ToString();
            }
            catch (Exception)
            {
                if (dataGridView1.Rows[0].Cells[0].Selected != true) MessageBox.Show("Inserte ID ");
            }
        }


Tienes que cambiar los valores de Rows a medida que se hacen las validaciones, lo que hace es tratar de llenar un string con el valor de la 1era fila y celda cuando se hace click en alguna celda que no sea la 1era, si este esta vacio muestra el mensaje.
Seguro hay otro modo mejor, pero puedes probarlo.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

[D4N93R]

En realidad nunca me gustó que el usuario llene data en el Grid View. Ahora, ya todas las dudas se cubrieron menos la parte de la validación no?

Pregunto ahora, qué evento estás usando para validar los datos?

EDIT: Pilla este enlace a ver si te sirve de algo:

http://csharplifestyle.blogspot.com/2009/06/validar-celdas-de-un-datagridview.html

piwi

Los eventos que estoy utilizando para validar los datos son cellvalidating con el e.cances y dataerror también con su e.cancel correspondiente.

A mi me gusta tambén más  utilizar en vez de datagrid, campos simples o como se diga (en origen de datos poner modo detalle) pero tengo problemas con un campo que le he dicho que es de tipo combobox.

Ahora estoy intentando averigual como puedo insertar el código (un numerico) pero quiero hacerlo yo y no que sea autoincremental.

Con el problema con el que me encuentro que no soy capaz de capturar  la linea insertada ya que el evento se lanza antes de insertar la línea y es donde lo capturo por lo que siempre me devuelve row 0

[D4N93R]

Cita de: piwi en  7 Julio 2010, 16:18 PM
Los eventos que estoy utilizando para validar los datos son cellvalidating con el e.cances y dataerror también con su e.cancel correspondiente.
Bueno con los enlaces que te pasé debes solucionar el problema. Sino postea el código de la validación.


Cita de: piwi en  7 Julio 2010, 16:18 PM
Ahora estoy intentando averigual como puedo insertar el código (un numerico) pero quiero hacerlo yo y no que sea autoincremental.
Simplemente lo pones, y ya, Que no sea Identity en la Base de Datos y lo metes en la consulta del insert.

Cita de: piwi en  7 Julio 2010, 16:18 PM
Con el problema con el que me encuentro que no soy capaz de capturar la linea insertada ya que el evento se lanza antes de insertar la línea y es donde lo capturo por lo que siempre me devuelve row 0
A ver, que no entendí bien, estás intentando guardar en el evento de cellvalidating? Puedes intentar guardar en el evento RowLeave o mucho mejor en el RowValidated despues de pasar por un RowValidating.

piwi

En el momento de dar al nuevo registro en bindingdourcenavigation, quiero meter en la celda un valor pero no se en que evento lo tengo que hacer porque no se seleccionar bien la nueva fila del datagridview

piwi

#16
Hola

Estoy haciendo pruebas de lo más sencillo y no encuentro la solución.

Estoy intentando mantener una tabla con dos campos:

idfabricante clave primaria no nula
d_fabricante

Para ello he creado un origne de datos de esta tabla y lo he arrastrado al formulario.

He codificado los siguientes eventos:

En este evento he añadido a mayores el chequeo del validate por si no pasa la validación que no siga con los cambios.

  Private Sub FABRICANTEBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FABRICANTEBindingNavigatorSaveItem.Click
       Dim li_retorno As Integer

       li_retorno = Me.Validate()

       If li_retorno = -1 Then
           Me.FABRICANTEBindingSource.EndEdit()
           Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
       End If

   End Sub

Esto ha sido creado por vb al arrastrar el origen de datos.

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       'TODO: esta línea de código carga datos en la tabla 'FabricanteDataSet.FABRICANTE' Puede moverla o quitarla según sea necesario.
       Me.FABRICANTETableAdapter.Fill(Me.FabricanteDataSet.FABRICANTE)

   End Sub

Aquí compruebo si idfabricante está nulo

 Private Sub FABRICANTEDataGridView_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles FABRICANTEDataGridView.CellValidating
         If FABRICANTEDataGridView.Columns(e.ColumnIndex).Name = "DataGridViewTextBoxColumn1" Then
           If e.FormattedValue IsNot Nothing AndAlso _
               String.IsNullOrEmpty(e.FormattedValue.ToString()) Then

               e.Cancel = True
           Else
               e.Cancel = False
           End If
       End If

   End Sub

En este he metido un mensaje de aviso por si dan a guardar o al nuevo en bindingnavigator

 Private Sub FABRICANTEDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles FABRICANTEDataGridView.DataError
       MsgBox(e.Exception.Message)
       e.Cancel = True
   End Sub


Validación de la fila

 Private Sub FABRICANTEDataGridView_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.RowValidating
       If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
           MsgBox("Error")
           e.Cancel = True
       Else
           e.Cancel = False


       End If
   End Sub

Los dos siguientes son de prueba pero me da error de nulo por lo que creo que no me inserta el valor

   Private Sub FABRICANTEDataGridView_RowLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowLeave
       If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
           FABRICANTEDataGridView(0, e.RowIndex).Value = UltimoCodigo()
       End If

   End Sub

   Private Sub FABRICANTEDataGridView_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowValidated
       If String.IsNullOrEmpty(FABRICANTEDataGridView(0, e.RowIndex).Value) Then
           FABRICANTEDataGridView(0, e.RowIndex).Value = UltimoCodigo()
       End If
   End Sub

Función que me retorna el último id

 Private Function UltimoCodigo() As Integer

       Dim Conexion As New SqlConnection("Data Source=192.168.1.100;Initial Catalog=PRUEBAS;user id = piwi; password =piwi;")
       Dim Datos As New DataSet

     Dim li_ultimo As Integer

        Conexion.Open()

        Dim Adaptador As New SqlDataAdapter("SELECT MAX(IDFABRICANTE) FROM FABRICANTE", Conexion)

        Adaptador.Fill(Datos)

        li_ultimo = Datos.Tables(0).Rows(0).Item(0)

        li_ultimo = li_ultimo + 1

        Conexion.Close()

        Return li_ultimo

   End Function


Con esto no me funciona, donde tengo que asignar el valor al idfabricante para que lo tenga antes de que cambie de fila o que de al boton guardar?

[D4N93R]

Hola,

Primero, en el evento DataError, no se por qué estás haciendo e.Cancel = True. Eso no lo deberías hacer, ese evento es para controlar luego de que se produce un error.

El Id del fabricante tienes que hacerlo al darle guardar, SIEMPRE, porque imagínate que lo pones al seleccionar la fila, por ejemplo; y te sale el ID 10001 y en otro equipo alguien abre la aplicación y y selecciona otra fila, le aparece el ID 10001, entonces lo que pasa es que al guardar se va a producir un error. Por lo que es mejor SIEMPRE que crees el ID en la base de datos :)

EDIT, utiliza las etiquetas Geshi para postear código.

piwi

Probare lo que me dices. En el evento de borrar quiero poner el mensaje si esta seguro pero no soy capaz de parar el borrado ya que el return no funciona y sigue hacia delante.
Lo de calcular el id por la base de datos se hace desde vb? No quiero utilizar los autonumericos

[D4N93R]

¿Cuál es el problema de usar autonuméricos?

Ah ok, lo de si está seguro o no, tiene que ser ANTES de comenzar el borrado :P