none
Convertir String a Object con TryCast RRS feed

  • Pregunta

  • En el siguiente codigo intento convertir una cadena en un objeto y guardar la misma en una variable de tipo Object pero al hacerlo esta ultima se guarda como String y no como un Object... Nose en donde estoy cometiendo el error

    Dim cadena As String = "principal.TabVivienda.Controls.Item(nameTxt)"
            Dim todo As Object = TryCast(cadena, Object)
            TextBox = todo

    Aclaro que ya puse Option Strict OFF
    • Editado Ultimatux viernes, 30 de agosto de 2019 13:43
    viernes, 30 de agosto de 2019 11:21

Respuestas

  • Ah, bien. Eso es bastante más simple.

    La primera y más simple solución es meter el tabpage en la variable como objeto, y no como cadena. Es decir:

    Dim miTabpage as tabpage

    miTabpage = principal.tabVivienda 'En lugar de "tabvivienda" entre comillas

    Eso te permite acceder directamente al contenido del tabPage

    texbox=miTabpage.controls.Item(nameTxt)

    Si no tienes más remedio que pasarlo como string, y no hay muchos tabpages, lo más simple es poner un simple Select (o una serie de If) que mapeen cada uno de los posibles strings al tabpage correspondiente.

    Si son demasiados como para que sea práctico mantener el Select, se puede usar System.Reflection. O se puede buscar en la colección de páginas del TabPage. Y si hay varios tabcontrols, se pueden buscar en la colección Controls de su contenedor. Pero antes de recurrir a esto, primero hay que ver si se puede resolver el problema en la primera de las formas, es decir, metiendo en la variable el objeto en lugar del string. Esto es mucho más eficiente, elegante y mantenible.

    • Marcado como respuesta Ultimatux martes, 3 de septiembre de 2019 11:41
    lunes, 2 de septiembre de 2019 6:17
  • existe una manera de asignacion mas corta [...]

    Bueno, puedes simplificar un poco el metodo poniendo los tipos correctos de variable y eliminando las asignaciones superfluas:

    Public Sub validacion(tabPage As TabPage, numTxt As Integer, valMax As Integer, valMsg As String)
            Dim TextBox As TextBox = tabpage.Controls.Item("TextBox" & numTxt)
            Dim flag = False
            Dim h = TextBox.Text
            Dim j = valMax
            '......
        End Sub

    • Marcado como respuesta Ultimatux martes, 3 de septiembre de 2019 11:41
    lunes, 2 de septiembre de 2019 14:03

Todas las respuestas

  • El TryCast es completamente superfluo cuando conviertes desde una clase hija a su clase madre. Solo se necesita en las conversiones opuestas, es decir, desde la madre a la hija.

    El codigo que tienes es completamente equivalente a este:

    Dim todo as Object = cadena

    Eso se debe a que la clase String (lo mismo que todas las demas clases) es hija de Object. Por lo tanto, todos los Strings son siempre Object, y en un Object siempre puedes guardar un String sin hacerle ningun cast.

    > Aclaro que ya puse Option Strict OFF

    Eso es irrelevante en este caso. El Option Strict solo afecta a la conversion en sentido contrario, es decir, cuando metes un object en un String (te da un error si esta en ON y no pones el Cast, pero te deja hacerlo sin Cast cuando esta en OFF). Pero cuando metes un String en un Object, el Option Strict no afecta nada.

    viernes, 30 de agosto de 2019 13:44
  • El TryCast es completamente superfluo cuando conviertes desde una clase hija a su clase madre. Solo se necesita en las conversiones opuestas, es decir, desde la madre a la hija.

    El codigo que tienes es completamente equivalente a este:

    Dim todo as Object = cadena

    Eso se debe a que la clase String (lo mismo que todas las demas clases) es hija de Object. Por lo tanto, todos los Strings son siempre Object, y en un Object siempre puedes guardar un String sin hacerle ningun cast.

    > Aclaro que ya puse Option Strict OFF

    Eso es irrelevante en este caso. El Option Strict solo afecta a la conversion en sentido contrario, es decir, cuando metes un object en un String (te da un error si esta en ON y no pones el Cast, pero te deja hacerlo sin Cast cuando esta en OFF). Pero cuando metes un String en un Object, el Option Strict no afecta nada.

    Gracias por responder Alberto, respecto a lo que dijiste, en su momento tambien por sentido comun llegue a pensar en esa relacion de Clase madre y clase hija, perfecto entonces, al menos me qedo claro el uso de option strict, ahora volviendo al codigo que expuse, existe algun modo de poder manipular esa variable de tipo object pero siendo yo quien escriba(algo asi como un string) tal vez no del modo que codifique pero algun otro modo, resumiendo quiero poder manerjar este fragmento "principal.TabVivienda.Controls.Item(nameTxt)" dentro de una variable

    sábado, 31 de agosto de 2019 17:16
  • resumiendo quiero poder manerjar este fragmento "principal.TabVivienda.Controls.Item(nameTxt)" dentro de una variable

    No sé si he entendido bien lo que quieres hacer. ¿Se trata de meter en la variable un texto que representa código ejecutable? Esta parte en principio es trivial, puedes simplemente asignarlo a la variable poniéndolo entre comillas. Pero me imagino que el propósito es poder después ejecutar ese código que hemos guardado en la variable. Esto es MUCHO más complicado de lo que parece (podemos estar hablando de un centenar de líneas de código para poderlo implementar). Antes de ponernos a intentarlo, convendría aclarar mejor cuál es el objetivo final a conseguir, porque a lo mejor hay otra forma más sencilla de lograrlo.
    sábado, 31 de agosto de 2019 18:25
  •  TextBox =principal.TabVivienda.Controls.Item(nameTxt)

    Sin dar muchos rodeos, lo que necesito es poder referenciar mediante variable distintos TabPage, estos ultimos estan todos en un solo formulario "principal"...

    por ejemplo en este codigo mi tabpage se llama "TabVivienda", asi mismo tengo varios y quisiera de ser posible algo como esto

    miTabpage as tabpage= "tabvivienda"

    texbox=principal.miTabpage.controls.Item(nameTxt)

    obviamente que este ultimo codigo esta mal pero asi se puede entender mejor...

    Gracias

    lunes, 2 de septiembre de 2019 2:17
  • Ah, bien. Eso es bastante más simple.

    La primera y más simple solución es meter el tabpage en la variable como objeto, y no como cadena. Es decir:

    Dim miTabpage as tabpage

    miTabpage = principal.tabVivienda 'En lugar de "tabvivienda" entre comillas

    Eso te permite acceder directamente al contenido del tabPage

    texbox=miTabpage.controls.Item(nameTxt)

    Si no tienes más remedio que pasarlo como string, y no hay muchos tabpages, lo más simple es poner un simple Select (o una serie de If) que mapeen cada uno de los posibles strings al tabpage correspondiente.

    Si son demasiados como para que sea práctico mantener el Select, se puede usar System.Reflection. O se puede buscar en la colección de páginas del TabPage. Y si hay varios tabcontrols, se pueden buscar en la colección Controls de su contenedor. Pero antes de recurrir a esto, primero hay que ver si se puede resolver el problema en la primera de las formas, es decir, metiendo en la variable el objeto en lugar del string. Esto es mucho más eficiente, elegante y mantenible.

    • Marcado como respuesta Ultimatux martes, 3 de septiembre de 2019 11:41
    lunes, 2 de septiembre de 2019 6:17
  • Lo que me planteaste me sirvio si pero ahora te consulto, existe una manera de asignacion mas corta tipo

    tabpage = tabvivienda sucede que ese fragmento de codigo  esta dentro de un procedimiento al cual le debo pasar 4 parametros, t muestro como qedaria con un ejemplo a ver si se puede acortar un poco mas sino esta bien asi nomas. Por otra parte desconocia que se podia trabajar con select tipo sql en vb.net, gracias por el aporte, añado el codigo del q mencione anteriormente

    Public Sub validacion(nomTabPage As Object, numTxt As Integer, valMax As Integer, valMsg As String)
            Dim TextBox As TextBox
            Dim m As Integer = numTxt
            Dim nameTxt As String = "TextBox" & m.ToString
            Dim tabpage As TabPage = nomTabPage
            TextBox = tabpage.Controls.Item(nameTxt)
            Dim flag = False
            Dim h = TextBox.Text
            Dim j = valMax
            If TextBox.Text <> "" Then
                For i = 1 To j
                    If h <> i Then
                        If h > j Then
                            flag = True
                            Exit For
                        End If
                    ElseIf h = i Then
                        Exit For
                    End If
                Next
                If flag = True Then
                    MsgBox("Solo acepta las siguientes opciones: " + Chr(13) + "" & valMsg & "", vbExclamation, "Atencion!")
                    TextBox.Focus()
                    TextBox.SelectAll()
                End If
            End If
        End Sub

    y el siguiente es un ejemplo donde paso algunos parametros para que se entienda mejor como se trabaja

    Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
            validacion(Me.TabVivienda, 1, 6, "1. Capital 2. Apóstoles 3. Oberá 4. Guaraní 5. Eldorado 6. Iguazú")
        End Sub

    supongo q ahora seria mas entendible todo

    lunes, 2 de septiembre de 2019 12:14
  • existe una manera de asignacion mas corta [...]

    Bueno, puedes simplificar un poco el metodo poniendo los tipos correctos de variable y eliminando las asignaciones superfluas:

    Public Sub validacion(tabPage As TabPage, numTxt As Integer, valMax As Integer, valMsg As String)
            Dim TextBox As TextBox = tabpage.Controls.Item("TextBox" & numTxt)
            Dim flag = False
            Dim h = TextBox.Text
            Dim j = valMax
            '......
        End Sub

    • Marcado como respuesta Ultimatux martes, 3 de septiembre de 2019 11:41
    lunes, 2 de septiembre de 2019 14:03