es posible pasar un grupo de nombres de cuadros de texto a cada declaración

Tengo un formulario con 7 cajas de texto y me gusta procesar los valores en ellos utilizando "Para cada" declaración, así que usé el siguiente código en el que definí una serie de cadenas que contienen los nombres de los cuadros de texto y pasar sus miembros a "me.controls()", incendios de errores en la línea con esta declaración: "Referencia objetiva no fijada a una instancia de un objeto"

 Dim grades() As String = {"sa", "sb", "sc", "sd", "ss", "sr", "st"}

            Dim x As String = InputBox("what is the multiplier", "Enter Value", "1")
            For Each s In grades
                If Not String.IsNullOrEmpty(Me.Controls(s).Text) Then
                    Me.Controls(s).Text = Math.Round(CDbl(Me.Controls(s).Text) * CDbl(x))
                End If
            Next

¿Cuál es el mejor método para lograr esto? Gracias.

Pregunta hecha hace 3 años, 4 meses, 26 días - Por bytebison


4 Respuestas:

  • ¿Por qué pasarías los nombres de los TextBoxes cuando puedes pasar TextBoxes ¿Sí? Suponiendo que hayas añadido el TextBoxes en el diseñador, se generó un campo para cada uno, así que utilice los:

    Dim textBoxes = {sa, sb, sc, sd, ss, sr, st}
    
    For Each textBox In textBoxes
        'Use textBox here.
    Next
    

    Respondida el Dec 20, 2020 a las 14:58 - por stackscripter

    Votos positivos: 0 | Votos negativos: 0

  • Además de crear un array de los propios TextBoxes (en lugar de sus nombres) como sugiere jmcilhinney, te recomiendo usar Doble.TryParse() para determinar si el multiplicador y los grados introducidos por el usuario son en realidad duplicados válidos antes de intentar hacer matemáticas con ellos. Esto evitará excepciones de tiempo de ejecución de mala entrada:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim grades() As TextBox = {sa, sb, sc, sd, ss, sr, st}
    
        Dim x As Double
        Dim strX As String = InputBox("what is the multiplier", "Enter Value", "1")
    
        If Double.TryParse(strX, x) Then
            For Each s In grades
                Dim grade As Double
                If Double.TryParse(s.Text, grade) Then
                    s.Text = Math.Round(grade * x)
                End If
            Next
        Else
            MessageBox.Show("Invalid Multiplier")
        End If
    End Sub
    

    Respondida el Dec 20, 2020 a las 15:08 - por quantumcoderd26d

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando, "Referencia objetiva no fijada a una instancia de un objeto", se produce porque el método Me.Controls() no está encontrando el control con el nombre especificado en ese momento. Una forma de solucionar este problema es verificar si el control existe antes de acceder a él.

    Aquí te muestro cómo puedes modificar tu código para solucionar este problema:

    vb
    Dim grades() As String = {"sa", "sb", "sc", "sd", "ss", "sr", "st"}
    
    Dim x As String = InputBox("what is the multiplier", "Enter Value", "1")
    
    For Each s As String In grades
        Dim control As Control = Me.Controls(s)
        If control IsNot Nothing AndAlso TypeOf control Is TextBox Then
            Dim textBox As TextBox = DirectCast(control, TextBox)
    
            If Not String.IsNullOrEmpty(textBox.Text) Then
                textBox.Text = Math.Round(CDbl(textBox.Text) * CDbl(x)).ToString()
            End If
        End If
    Next
    

    En este código, se verifica si el control con el nombre especificado es un TextBox y si existe en Me.Controls() antes de intentar acceder y modificar su valor. Esto ayudará a evitar el error "Referencia objetiva no fijada a una instancia de un objeto".

    Espero que esta modificación te ayude a solucionar el problema que estás experimentando. Si tienes alguna otra pregunta, ¡no dudes en preguntar!

    Respondida el Dec 21, 2020 a las 14:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "Referencia a objeto no establecida para una instancia de un objeto" se produce porque Me.Controls(s).Text intenta acceder a un cuadro de texto que no existe en el formulario. Para resolver este problema, debes asegurarte de que los nombres de los cuadros de texto en la matriz grades coincidan exactamente con los nombres de los cuadros de texto en el formulario.

    He aquí un código corregido que debería funcionar correctamente:

    vb
    Dim grades() As String = {"sa", "sb", "sc", "sd", "ss", "sr", "st"}
    
    Dim x As String = InputBox("what is the multiplier", "Enter Value", "1")
    For Each s In grades
        If Me.Controls.ContainsKey(s) AndAlso Not String.IsNullOrEmpty(Me.Controls(s).Text) Then
            Me.Controls(s).Text = Math.Round(CDbl(Me.Controls(s).Text) * CDbl(x))
        End If
    Next
    

    En este código corregido, utilizamos Me.Controls.ContainsKey(s) para verificar si el cuadro de texto con el nombre s existe en el formulario. Si existe, procedemos a actualizar su valor de texto.

    Respondida el Dec 21, 2020 a las 14:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0