Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: piwi en 5 Julio 2010, 20:58 pm



Título: Validaciones
Publicado por: piwi en 5 Julio 2010, 20:58 pm
Hola.

Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?

Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?

Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel

Como puedo interrumpir el evento BindingNavigatorSaveItem?

Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.


Un saludo.


Título: Re: Validaciones
Publicado por: [D4N93R] en 6 Julio 2010, 05:11 am
Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?
Que tipo de validaciones?


Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?
En la base de datos lo pones primary key y not null


Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel
Tendría que ver el código.


Como puedo interrumpir el evento BindingNavigatorSaveItem?


Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.
Google?

http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx (http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx)
http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx (http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx)


Título: Re: Validaciones
Publicado por: piwi en 6 Julio 2010, 07:32 am
Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?
Que tipo de validaciones?

Me refiero a una tabla con un campo código (PK) y una descripción. Creo el origen de datos y lo arrastro al formulario. En que evento o eventos tengo que realizar la validación que antes de guardar el campo código tenga un valor y que este no esté repetido?

Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?
En la base de datos lo pones primary key y not null

Eso ya lo tengo y por eso me da error si el usuario solamente introduce la descripción y le da al grabar. Me refiero desde vb.


Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel
Tendría que ver el código.

El cellvalidating cuando utilizo e e.cancel = true no me dejar salir de la celda que se está validando pero me deja cambiar del registro con el ratón. Como puedo hacer para que no salga de la celda de ninguna manera hasta que los datos estén validados?


Como puedo interrumpir el evento BindingNavigatorSaveItem?


Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.
Google?

http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx (http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx)
http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx (http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx)

Ahora miro los link pero por más que busco en google, no encuentro un código que funcione al 100% y haciendo pruebas siempre acabo con el mensaje de que la clave no puede ser nula.


Título: Re: Validaciones
Publicado por: piwi en 6 Julio 2010, 07:38 am
Ya he visto estos link y todo esto está bien mientras que no utilice el ratón, me controla bien no salir del campo pero en el momento que utilizo el ratón me permite dejar el regisro con la celda sin valida y entonces cuando doy a grabar da el error


Título: Re: Validaciones
Publicado por: [D4N93R] en 6 Julio 2010, 16:18 pm
Y en la base de datos, esas celdas permiten NULL?


Título: Re: Validaciones
Publicado por: piwi en 6 Julio 2010, 23:41 pm
Hola.

soy muy malo explicándome. Voy a poner un ejemplo muy simple.

Tenemos una tabla con dos campos ID (este campo seria clave primaria por lo tanto no permite nulos ) y DESCRIPCION (un campo que permite nulos)

Creo un origen de datos y lo arrastro al form por lo que me crea un datagridview en el formulario.

Lo que tengo que hacer es no permitir grabar si el campo ID es nulo. Pensé que con el evento cellvalidation lo podía controlar utilizando el e.cancel pero solamente me funciona cuando doy a la tabulación y no me permite cambiar de celda pero cuando utilizo el rato y cambio de fila me lo permite y me situo en otra fila donde el cellvalidation lo hace en esta que todo está bien pero cuando doy a guardar me falla el registro donde falta ID que lo he dejado a nulo en el datagridview.

Lo que quiero saber que eventos debo utilizar para validar datos. Además del evento cellvalidation, tengo que codficar algun otro?

Un saludo


Título: Re: Validaciones
Publicado por: 43H4FH44H45H4CH49H56H45H en 7 Julio 2010, 00:03 am
El ID debe crearse en la BD (autoincremento y demas), no debes hacerlo en tu aplicacion.


Título: Re: Validaciones
Publicado por: Shell Root en 7 Julio 2010, 00:19 am
Bueno, no leí todo el post así que puedo estar equivocado. Pero lo que dice 43H4FH44H45H4CH49H56H45H <Fucking se registro estando beodo?>. Tal vez, puede hacerse así, pero en ocasiones se pierde algunos ID's, por eso siempre prefiero <Dependiendo del tiempo para la terminación de la aplicación y de la complejidad de ella> generar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.


Título: Re: Validaciones
Publicado por: 43H4FH44H45H4CH49H56H45H en 7 Julio 2010, 00:53 am
Para aplicaciones pequeñas no creo que haya problema hacerlo de un modo u otro, pero si tenemos una BD con bastantes registros?
generar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.

Que la aplicación busque un Id disponible en una cantidad grande de registros ya es otra cosa...


Título: Re: Validaciones
Publicado por: [D4N93R] en 7 Julio 2010, 04:33 am
Para aplicaciones pequeñas no creo que haya problema hacerlo de un modo u otro, pero si tenemos una BD con bastantes registros?
generar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.

Que la aplicación busque un Id disponible en una cantidad grande de registros ya es otra cosa...

Exacto, es diferente, para la creación de registros, ponle Identity 1,1, es decir, que comience del 1 y que vaya de 1 a 1, o a tu preferencia.

Nunca crees los ID en la aplicación, a menos de que el modelo de negocios lo requiera.

saludos


Título: Re: Validaciones
Publicado por: piwi en 7 Julio 2010, 07:08 am
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?


Título: Re: Validaciones
Publicado por: 43H4FH44H45H4CH49H56H45H en 7 Julio 2010, 15:30 pm
Bueno este modo es "cutre", pero puedes mejorarlo:

Código
  1. private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
  2.        {
  3.            try
  4.            {
  5.                string pru = dataGridView1.Rows[0].Cells[0].Value.ToString();
  6.            }
  7.            catch (Exception)
  8.            {
  9.                if (dataGridView1.Rows[0].Cells[0].Selected != true) MessageBox.Show("Inserte ID ");
  10.            }
  11.        }

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.


Título: Re: Validaciones
Publicado por: [D4N93R] en 7 Julio 2010, 15:37 pm
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 (http://csharplifestyle.blogspot.com/2009/06/validar-celdas-de-un-datagridview.html)


Título: Re: Validaciones
Publicado por: 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.

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


Título: Re: Validaciones
Publicado por: [D4N93R] en 7 Julio 2010, 16:30 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.


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.

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.


Título: Re: Validaciones
Publicado por: piwi en 7 Julio 2010, 21:28 pm
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


Título: Re: Validaciones
Publicado por: piwi en 8 Julio 2010, 08:24 am
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?


Título: Re: Validaciones
Publicado por: [D4N93R] en 8 Julio 2010, 15:20 pm
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.


Título: Re: Validaciones
Publicado por: piwi en 8 Julio 2010, 17:33 pm
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


Título: Re: Validaciones
Publicado por: [D4N93R] en 8 Julio 2010, 17:45 pm
¿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


Título: Re: Validaciones
Publicado por: piwi en 8 Julio 2010, 18:00 pm
Hay un evento de preborrado?
Por los autonumericos simplemente me gusta tener control calculandolos


Título: Re: Validaciones
Publicado por: [D4N93R] en 8 Julio 2010, 18:37 pm
Más bien pierdes control, Que ganas teniendo "control" sobre el ID? nada..

Citar
Hay un evento de preborrado?
Se llama boton de borrar :P Ahi haces la validación xD


Título: Re: Validaciones
Publicado por: piwi en 9 Julio 2010, 07:21 am
En mi caso necesito dar un id por tipo que es otro campo por lo que la clave sería id m
Más bien pierdes control, Que ganas teniendo "control" sobre el ID? nada..

En mi caso la clave la forman dos campos, un id y un tipo por lo que tengo que calcular el id dependiendo del tipo.

Citar
Hay un evento de preborrado?
Se llama boton de borrar :P Ahi haces la validación xD

El botón que utilizo es BindingNavigatorDeleteItem_Click pero ahí ya no puedo hacer nada. Me extraña que no puedan insertar una validación cuando utilizar un bindingnavigator. Quizá hay que sobreescribir el evento y en caso que digan que quieren borrar entonces llamarlo.


Título: Re: Validaciones
Publicado por: piwi en 9 Julio 2010, 07:24 am
Creo que con esto ya he conseguido realizar un modelo para un mantenimiento de una tabla. También tengo contemplado preguntar si se quiere borrar un registro por si alguien no sabe como hacerlo. Quizá todos los sabeís pero por si acaso aquí está.

Si alguien ve algo que no está correcto se lo agradecería

Código
  1. Imports System.Data.SqlClient
  2.  
  3. Public Class Form1
  4.  
  5.    Private BotonBorrar As ToolStripItem
  6.  
  7.  
  8.    Private Sub FABRICANTEBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FABRICANTEBindingNavigatorSaveItem.Click
  9.        Dim li_retorno As Integer
  10.  
  11.        li_retorno = Me.Validate()
  12.  
  13.        If li_retorno = -1 Then
  14.            Me.FABRICANTEBindingSource.EndEdit()
  15.            Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
  16.        End If
  17.  
  18.    End Sub
  19.  
  20.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  21.        'TODO: esta línea de código carga datos en la tabla 'FabricanteDataSet.FABRICANTE' Puede moverla o quitarla según sea necesario.
  22.        Me.FABRICANTETableAdapter.Fill(Me.FabricanteDataSet.FABRICANTE)
  23.  
  24.        Me.BotonBorrar = FABRICANTEBindingNavigator.DeleteItem
  25.  
  26.    End Sub
  27.  
  28.    Private Sub FABRICANTEDataGridView_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.CellBeginEdit
  29.        If FABRICANTEDataGridView(1, e.RowIndex).Value Is DBNull.Value Then
  30.            FABRICANTEDataGridView(1, e.RowIndex).Value = UltimoCodigo()
  31.        End If
  32.    End Sub
  33.  
  34.    Private Sub FABRICANTEDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles FABRICANTEDataGridView.DataError
  35.        MsgBox(e.Exception.Message, MsgBoxStyle.Exclamation, "Fabricantes")
  36.    End Sub
  37.  
  38.    Private Sub FABRICANTEDataGridView_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowValidated
  39.        Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
  40.    End Sub
  41.  
  42.    Private Sub FABRICANTEDataGridView_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.RowValidating
  43.        If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
  44.            MsgBox("Debe introducir el fabricante", MsgBoxStyle.Exclamation, "Fabricantes")
  45.            e.Cancel = True
  46.        Else
  47.            e.Cancel = False
  48.        End If
  49.    End Sub
  50.  
  51.    Private Function UltimoCodigo() As Integer
  52.  
  53.        Dim Conexion As New SqlConnection("Data Source=192.168.1.1;Initial Catalog=PRUEBAS;user id = piwi; password = piwi;")
  54.        Dim Datos As New DataSet
  55.  
  56.        Dim li_ultimo As Integer
  57.  
  58.        Conexion.Open()
  59.  
  60.        Dim Adaptador As New SqlDataAdapter("SELECT MAX(IDFABRICANTE) FROM FABRICANTE", Conexion)
  61.  
  62.        Adaptador.Fill(Datos)
  63.  
  64.        If Datos.Tables(0).Rows(0).Item(0) Is DBNull.Value Then
  65.            li_ultimo = 0
  66.        Else
  67.            li_ultimo = Datos.Tables(0).Rows(0).Item(0)
  68.        End If
  69.  
  70.        li_ultimo = li_ultimo + 1
  71.  
  72.        Conexion.Close()
  73.  
  74.        Return li_ultimo
  75.  
  76.    End Function
  77.  
  78.    Private Sub FABRICANTEBindingNavigator_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles FABRICANTEBindingNavigator.ItemClicked
  79.        If e.ClickedItem Is Me.BotonBorrar Then
  80.            If MessageBox.Show("Está seguro de querer borrar el registro?", "Fabricantes", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
  81.                Me.FABRICANTEBindingNavigator.DeleteItem = Me.BotonBorrar
  82.            Else
  83.                Me.FABRICANTEBindingNavigator.DeleteItem = Nothing
  84.            End If
  85.        End If
  86.  
  87.    End Sub
  88.  
  89. End Class
  90.  



Título: Re: Validaciones
Publicado por: [D4N93R] en 9 Julio 2010, 15:11 pm
Buenísimo, que bueno que resolviste el problema, saludos!


Título: Re: Validaciones
Publicado por: piwi en 10 Julio 2010, 14:26 pm
Ahora me encuentro con otro problema. Tengo dos combobox dentro del datagrid enlazados a datos. Como hago para filtrar el contenido del segundo dependiendo de lo que me seleccionen en el primero?

Un saludo.


Título: Re: Validaciones
Publicado por: [D4N93R] en 10 Julio 2010, 15:45 pm
Una pregunta para poder contestarte, estás queriendo filtrar los resultados con el Combo Box?


Título: Re: Validaciones
Publicado por: piwi en 10 Julio 2010, 16:13 pm
Si, tengo un combo con fabricantes y otro con productos al seleccionar un fabricante, solamente mostrar los productos de este.

Fabricantes: idfabricante, fabricante
Productos idproducto(pk), idfabricante, producto


Título: Re: Validaciones
Publicado por: [D4N93R] en 10 Julio 2010, 18:02 pm
Suscríbete al evento TextChanged o SelectedItemChanged del ComboBox y en ese método setteas
la propiedad Filter del bindingSource apropiadamente.

EDIT:

Ok, es fácil, xD tiempo sin usarlo!! Simplemente en el bindingSource, espero que estés usando uno, en el TextChange o en el SelectedItemChanged modifica la propiedad Filter con el filtro apropiado, como:

Código
  1. bindingSource.Filter = "columna = '"+variableDelComboBox+"'";
  2.  

Espero te sirva!

Saludos!


Título: Re: Validaciones
Publicado por: piwi en 12 Julio 2010, 12:18 pm
Gracias. Ya me filtra. El problema que tengo es cuando cambio el primer combo, como asigno un nulo al segundo para que se borre la selección anterior?



Título: Re: Validaciones
Publicado por: [D4N93R] en 12 Julio 2010, 17:58 pm
No entendí la pregunta  ;D


Título: Re: Validaciones
Publicado por: piwi en 12 Julio 2010, 18:13 pm
En el datagridview tengo dos campos de tipo combobox, uno es fabricante y otro producto. En el momento que selecciono el fabricante, me filtra los productos de este.
Lo que quiero es dejar el producto a nulo después de seleccionar el fabricante para así en caso que seleccione otro fabricante, no me quede el producto del anterior fabricante.

Un saludo.


Título: Re: Validaciones
Publicado por: [D4N93R] en 12 Julio 2010, 21:40 pm
Pero ya vaaa, tu quieres filtrar con los combobox que estan Dentro del Datagrid? Puedes postear un Screenshot de tu formulario por favor.


Título: Re: Validaciones
Publicado por: piwi en 20 Julio 2010, 07:23 am
Perdón por la tardanza pero he estado un poco liado con otros temas.
Aquí pongo la captura.
(http://s2.subirimagenes.com/otros/previo/thump_4822886captura.jpg)

Basicamente lo que tengo son tres origenes de datos, uno licencias que es el que está en el formulario y otros tres que son producto, cliente y local que serán lo que utilizaré en los combobox como muestro en el ejemplo.
El problema lo tengo que si doy a un registro nuevo y en un combobox selecciono un valor, no me deja pasar el foco a otro campo ni hacer nada, como si se bloqueara, solamente seleccionar otro valor del combo.

Como hay que utilizar un combobox que me muestre el nombre del cliente y que contenga la idcliente y lo guarde en licencias?

Gracias por todo.


Título: Re: Validaciones
Publicado por: seba123neo en 20 Julio 2010, 07:44 am
la verdad no se como lo estas haciendo, no lei todo el topic, pero para cargar un combo lo podes hacer de varias formas, yo no opto por usar los bindingnavigator o como se llamen y enlazar los controles con sus datasources, prefiero escribir codigo y hacerlo todo en clases, si es posible en 3 capas, sino te lias con los origenes de datos, me acuerdo en visual basic 6 con los controles DATA y ADOC se hacia asi  :xD, pero eso es prehistoria ya, pero bueno cada uno lo hace como puede o como le enseñaron.

yo para cargar un combo directamente tengo un metodo que me devuelve un datareader y con eso lo recorro y asigno los valores, es lo unico que te puedo decir ya que no uso esa forma.

saludos.


Título: Re: Validaciones
Publicado por: piwi en 20 Julio 2010, 08:18 am
Hola seba123neo

El problema que estoy aprendiendo a marchas forzadas. También lo he intentado de otra forma
Código:
Imports System.Data.SqlClient

Public Class Form1

    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 'LicenciasDataSet.LICENCIAS' Puede moverla o quitarla según sea necesario.
        Me.LICENCIASTableAdapter.Fill(Me.LicenciasDataSet.LICENCIAS)

        Dim Conexion As String = "Data Source=192.1681.1;Initial Catalog=prueba;user id = piwi; password = piwi;"
        Dim da As New SqlDataAdapter("select codcliente, nombrecliente from clientes where codcliente < 5", Conexion)
        Dim ds As New DataSet

        da.Fill(ds)

        Try

            IDLOCALComboBox.DataSource = ds.Tables(0)
            IDLOCALComboBox.ValueMember = "codcliente"
            IDLOCALComboBox.DisplayMember = "nombrecliente"
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub



    Private Sub LICENCIASBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LICENCIASBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.LICENCIASBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.LicenciasDataSet)

    End Sub
End Class

Me pasa lo mismo, en el momento que selecciono algo, se queda bloqueado y no me deja salir del combobox.

Me podrias explicar o ponerme un codigo para ver la forma correcta de hacerlo?

Gracias.


Título: Re: Validaciones
Publicado por: piwi en 22 Julio 2010, 12:36 pm
Por si a alguien le puede ayudar, me respondo a mi mismo

Hay veces que al añadirlo de forma automática, la propiedad que pone como databinding es la propiedad "Text" cuando debería ser "SelectedValue".

Para solucionarlo vamos a las propiedades y en la sección "DataBindings" quitamos el binding de la propiedad "Text" y lo ponemos en la propiedad "SelectedValue"


Título: Re: Validaciones
Publicado por: [D4N93R] en 22 Julio 2010, 14:58 pm
Sigo sin entender, no era un DataGridView en donde tenías el problema?  Ahora tienes es un formulario :-X  No entiendou!!



Título: Re: Validaciones
Publicado por: piwi en 22 Julio 2010, 17:04 pm
Buenas.

Cuando empecé lo estaba haciendo en un datagrid y lo he conseguido pero me he encontrado con problema que eran varios campos y no me gusta dejar una barra de desplazamiento horizontal porque lo veo poco practico y lo he intentado hacer sin datagridview para que sea más comodo.
De todos modos he dejado una captura de pantalla unos post más abajo donde se ve que lo hacía con campos sueltos.


Título: Re: Validaciones
Publicado por: piwi en 22 Julio 2010, 17:58 pm
Cuando doy a nuevo en Bindingnavigator, en que evento puedo darle valor a una caja de texto?
Lo he probado en BindingNavigatorAddNewItem_Click pero este evento se produce justo al dar al boton nuevo así que me inserta el valor en la caja y después me inserta un registro nuevo.
Yo lo que quiero es asignar el valor en el nuevo registro.


Título: Re: Validaciones
Publicado por: [D4N93R] en 22 Julio 2010, 18:32 pm
Cual es el origen de datos de ese formulario?


Título: Re: Validaciones
Publicado por: piwi en 22 Julio 2010, 18:49 pm
No entiendo la pregunta  >:( El origen es una tabla de la base de datos. Todo me funciona bien pero lo que quiero es que cuando de al boton nuevo, saber que evento se produce justo despues de insertar el nuevo registro para que cuando asigne un id a la caja de texto, esta sea del registro recien insertado.


Título: Re: Validaciones
Publicado por: [D4N93R] en 22 Julio 2010, 19:20 pm
"El origen es una tabla de la base de datos"
 Ok, pero cuando guardas un registro en la base de datos, lo haces a mano, o utilizas un SqlDataSource?

"Todo me funciona bien pero lo que quiero es que cuando de al boton nuevo, saber que evento se produce justo despues de insertar el nuevo registro"
 Después de insertarlo en la base de datos? o despuès de darle click a nuevo?

"para que cuando asigne un id a la caja de texto, esta sea del registro recien insertado."
  Entonces el evento que quieres es después de darle click al botón nuevo, antes de darle a guardar?


Título: Re: Validaciones
Publicado por: piwi en 22 Julio 2010, 22:49 pm
lo que he hecho es crear y arrastrar el origen de datos al formulario por lo que me ha creado todo automaticamente.
Por un lado la barra de navegacion en la parte superior y los campos sueltos enlazado al origen de datos.
Donde codifico la asignación del valor para que al dar al boton nuevo (+ amarillo) pueda asignar un valor a un campo del nuevo registro'

Imagina un origen de datos id_campo, campo. Estos dos los tengo en el formulario enlazados como he comentado arriba. Cuando doy al boton nuevo me crea un registro nuevo, donde tengo que codificar id_campo.text = contador? para que asigne la variable contador al id_campo del nuevo registro?

Un saludol


Título: Re: Validaciones
Publicado por: [D4N93R] en 23 Julio 2010, 00:18 am
Bueno, primero, hubieses solucionado todo esto si usaras Identity en el Primary Key, pero bueno, veamos, debe haber un objeto llamado ALGOBindingSource que tiene un evento al cual te tienes que subscribir: AddingNew y colocar algo así:

Código
  1.  private void bindingSource1_AddingNew(object sender, AddingNewEventArgs e)
  2.  {
  3.        e.NewObject = ((System.Data.DataView)(bindingSource1.List)).AddNew();
  4.        ((System.Data.DataRowView)(e.NewObject))["Columna1"] = "123";
  5.  }
  6.  

Ahí lo que haces es reemplazar los nombres de los objetos por los de tu formulario, y en vez de poner "123", pones tu contador.

Saludos


Título: Re: Validaciones
Publicado por: piwi en 23 Julio 2010, 07:53 am
Gracias por la respuesta.

El evento que me comentas me hace lo mismo que el BindingNavigatorAddNewItem_Click, es decir, en este evento he puesto un mensaje y la asignación.

Código:
    Private Sub LICENCIASBindingSource_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles LICENCIASBindingSource.AddingNew

        IDLICENCIATextBox.Text = "300"
        MsgBox("hola")

    End Sub

Abro el formulario y me aparecen los campos. Por defecto estoy en el primer registro y cuando doy al nuevo, me pone 300 en el registro actual, me muestra el mensaje y luego me inserta registro nuevo por lo que idlicencia esta vacía.

Yo lo que quiero es que primero inserte nuevo registro y en este que me inserte 300 en idlicenciatextbox.

Estoy hasta los  :-X


Título: Re: Validaciones
Publicado por: [D4N93R] en 23 Julio 2010, 15:11 pm
Pero hazlo como yo te dije, usando el AddingNewEventArgs... No colocando valor a la caja de texto.


Título: Re: Validaciones
Publicado por: piwi en 23 Julio 2010, 18:52 pm
Me he perdido  :huh:


Título: Re: Validaciones
Publicado por: [D4N93R] en 23 Julio 2010, 18:57 pm
Código
  1.  
  2. private void bindingSource1_AddingNew(object sender, AddingNewEventArgs e)
  3.  {
  4.          //en vez de bindingsource1 pones el nombre de tu bindingsource, es un control que esta abajo del formulario
  5.        e.NewObject = ((System.Data.DataView)(bindingSource1.List)).AddNew();
  6.        ((System.Data.DataRowView)(e.NewObject))["Columna1"] = "123"; // aki pones tu contador
  7.        //reemplaza "Columna1" con el nombre de la columna del donde va el contador, el ID ese.
  8.  }
  9.  
  10.  

A ver si así está mejor.