none
TextBox que no admite valor null RRS feed

  • Pregunta

  • Hola, tengo un problema con un TextBox, el cual contiene un valor numérico en la base de datos, pero cuando le quito el valor y quiero que no contenga nada, no me lo admite y no me deja pasar al siguiente campo. ¿Alguien me puede indicar el motivo por lo que ocurre esto?

    En la Base de datos esta declarado como float y permite valores NULL.

    (Bueno, me esta pasando con todos los TextBox que en teoría son numéricos).


    • Editado rbs61 miércoles, 9 de diciembre de 2015 8:16
    miércoles, 9 de diciembre de 2015 7:59

Respuestas

  • Bueno, encontré el problema, no es qué tuviera un código para los eventos Validated o Validating, si no que la propiedad "CausesValidation" estaba a True, y claro esto ya me generaba los eventos de validación. (Como no he podido verlo antes...!!!)

    Daros a todos las gracias por vuestro tiempo.

    Un saludo.

    • Marcado como respuesta rbs61 viernes, 11 de diciembre de 2015 7:37
    viernes, 11 de diciembre de 2015 7:37

Todas las respuestas

  • Los textboxes por sí solos no tienen ningún problema con el valor null, que presentan igual que si fuera un string vacío. Si no te funcionan al presentar valores que en la base de datos son NULL, entonces el problema no es del propio textbox, sino tiene que estar en el código auxiliar que has escrito para cargar o validar el textbox. Alguna instrucción dentro de ese código no está gestionando correctamente los null, y por eso no funciona debidamente. Por ejemplo, ¿has tenido en cuenta que los NULL de base de datos se leen como DBNull.Value, y has convertido ese DBNull.Value en un null de .Net antes de asignárselo al textbox? Es solo un ejemplo, no digo que el problema sea precisamente ese, simplemente es una indicación de que debes prestar atención al código que has escrito para recoger los valores de base de datos y asignárselos al textbox.
    • Propuesto como respuesta Sergio Parra miércoles, 9 de diciembre de 2015 11:54
    miércoles, 9 de diciembre de 2015 9:10
  • Hola Alberto, he probado creando un formulario nuevo y arrastrando los campos del DataTable al formulario, y sin escribir ningún código, están actuando de igual forma, comprendo que no tiene ningún sentido...por eso he expuesto la duda en el foro.

    El valor del campo en concreto tiene un numero, pero al quitarlo del TextBox es cuando no está actuando correctamente.

    un saludo.


    • Editado rbs61 miércoles, 9 de diciembre de 2015 9:16
    miércoles, 9 de diciembre de 2015 9:14
  • Estoy de acuerdo con Alberto, deberías gestionarlo con código

    if(elcamporleido == null)
    {
      textbox.text = "";
      texbox.value = null;
    }


    • Editado legolas2024 miércoles, 9 de diciembre de 2015 9:29
    miércoles, 9 de diciembre de 2015 9:29
  • Este código es el que estoy utilizando: 
        Private Sub txtValorZ_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtValorZ.Leave
          Call Ctrl_CalcularDistorsion()
          Me.txtUnderCut.Select()  (esta orden no llega a ejecutarse)
       End Sub
    
        Private Sub Ctrl_CalcularDistorsion()
          Dim val As Decimal
          If String.IsNullOrEmpty(txtValorZ.Text) Then txtValorZ.Text = "0"
          If String.IsNullOrEmpty(txtUnderCut.Text) Then txtUnderCut.Text = "0"
          If CInt(txtValorZ.Text) = 0 Or CInt(txtUnderCut.Text) = 0 Then
             txtDistorsionSpk.Text = ""
             txtDistorsion.Text = ""
          Else
             Try
                If cboTipoEngranaje.Text.Length > 0 And (CInt(IsNumeric(txtValorZ.Text)) And CInt(txtValorZ.Text)) > 0 Then
                   If txtUnderCut.Text.Length > 0 Then
                      val = Convert.ToDecimal(CalcularDistorsion(CInt(cboTipoEngranaje.SelectedValue), CInt(txtValorZ.Text), Formula, CDec(txtUnderCut.Text)))
                   Else
                      val = Convert.ToDecimal(CalcularDistorsion(CInt(cboTipoEngranaje.SelectedValue), CInt(txtValorZ.Text), Formula))
                   End If
                   Select Case Formula
                      Case FormulaDistorsion.SPK
                         txtDistorsionSpk.Text = val.ToString("N6")
                      Case Else
                         txtDistorsion.Text = val.ToString("N6")
                   End Select
                End If
             Catch ex As Exception
                Exit Try
             End Try
          End If
       End Sub
    no se sale del campo "txtValorZ"

    • Editado rbs61 miércoles, 9 de diciembre de 2015 9:42
    miércoles, 9 de diciembre de 2015 9:34
  • En Ctrl_CalcularDistorcion() tiene que estar dando algún error pero como tienes el Try Catch sin mensaje no lo muestra.

    Pon un mensaje del error

    ...
    Catch ex As Exception
       MsgBox (ex.Message)
    End Try


    Saludos, Javier J

    miércoles, 9 de diciembre de 2015 10:46
  • Hola Javier, he puesto el mensaje que me indicas, pero no salta ningún error.

    En el campo "txtDistorsionEspecial" que también es un campo numérico, no tengo ningún problema (al pulsar el Enter o Tab) me salta al siguiente campo (aunque el campo esté vacío). La única diferencia que hay entre un campo y otro es la propiedad "Text" del "DataBindings". Es algo que no acabo de pillar.

    un saludo.

    miércoles, 9 de diciembre de 2015 11:52
  • Hola.

    Has intentado hacer la comprobación del texbox en el evento validated o en el evento validating, es posible que si lo tienes enlazado mediante un databilding se intente guardar antes de que tú, en el metodo valides si es correcto o no.

    If String.IsNullOrEmpty(txtValorZ.Text) Then txtValorZ.Text = "0"

    pero en alguno de los dos eventos de validación. Yo me inclinaria mas por validating que se produce durante la validación.


    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido útil agradécelo marcándola como útil.


    • Editado Rodripelto miércoles, 9 de diciembre de 2015 14:07
    miércoles, 9 de diciembre de 2015 14:03
  • Hola Rodripelto, en un principio si tenia en los eventos Validated y Validating un código para que controlar solo la introducción de dígitos numéricos, pero he eliminado estos eventos por el tema de poder aceptar los valores nulos.
    miércoles, 9 de diciembre de 2015 14:09
  • Yo provaria a ver si se soluciona el problema, y si con lo que te comento se soluciona luego busca la solución para poder enviar valores nulos. Creo que null y dbnull no es lo mismo, por lo que si envias null a la bd no lo acepta, tambien pude suceder que nisiquiera etes enviado null o dbnull, si no una cadena vacia y como el campo en la bd es float no te lo acepta.

    Es de buena educación dar las gracias cuando te ayudan, si alguna respuesta te ha sido útil agradécelo marcándola como útil.

    miércoles, 9 de diciembre de 2015 14:28
  • El problema no es que la BBDD me acepte el valor NULL, si no que el código despues del evento Leave se activan las funciones "PierdeFoco", "TieneFoco"

        Private Sub TieneFoco(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim miTextBox As TextBox
            miTextBox = CType(sender, TextBox)
            miTextBox.BackColor = Color.Yellow
        End Sub
    
        Private Sub PierdeFoco(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim miTextBox As TextBox
            miTextBox = CType(sender, TextBox)
            miTextBox.BackColor = Color.White
        End Sub
    
    de ahí pasa al evento "frmMtMaquinasCliente2_Activated" y vuelve a situarse en el objeto "txtDistorsion"

    miércoles, 9 de diciembre de 2015 15:47
  • Bueno, encontré el problema, no es qué tuviera un código para los eventos Validated o Validating, si no que la propiedad "CausesValidation" estaba a True, y claro esto ya me generaba los eventos de validación. (Como no he podido verlo antes...!!!)

    Daros a todos las gracias por vuestro tiempo.

    Un saludo.

    • Marcado como respuesta rbs61 viernes, 11 de diciembre de 2015 7:37
    viernes, 11 de diciembre de 2015 7:37