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 pasarTextBoxes
¿Sí? Suponiendo que hayas añadido elTextBoxes
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 enMe.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 matrizgrades
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 nombres
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