none
Instanciar Form dinamicamente pasando valores a sus Propiedades (VB.NET 2012)

    Pregunta

  • Buenas tardes. Necesito instanciar un form partiendo desde su nombre.

    Hasta ahora lo he conseguido con el siguiente código

     

    Dim FormDet As New Form
            FormDet = Activator.CreateInstance("LIGNUM", "FormDePrueba").Unwrap
            FormDet.ShowDialog()

    El inconveniente que tengo, es que necesito pasarle valores a las propiedades del FormDePrueba

    ¿Alguien me sabe como podría lograr esto?

    Desde ya muchas gracias.

    Saludos.

    martes, 2 de mayo de 2017 17:02

Respuestas

  • "CM16" preguntó:

    > si no me equivoco, si yo realizo esto:
    > Dim FormDet As FormDePrueba = DirectCast(GetForm("FormDePrueba"), FormDePrueba)
    >
    > debo especificar que pertenece a la clase/Form FormDePrueba, algó que aún no lo
    > sé porque debe ser dinámico

    Si no sabes cómo se llama el formulario dinámico, NO PUEDES convertirlo a un tipo de formulario concreto (Form1, Form23, FormDePrueba) mediante el operador DirectCast; tienes que trabajar con el tipo de dato Form:

        ' Referenciamos el formulario llamado FormDePrueba
        Dim FormDet As Form = GetForm("FormDePrueba")

    Pero si las propiedades que deseas asignar no pertenecen a la clase base Form, entonces tendrías que utilizar la reflexión para crear una instancia del tipo de formulario concreto y asignarle, también mediante reflexión, el valor a sus propiedades.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 3 de mayo de 2017 11:30
    Moderador
  • "CM16" escribió:

    > Exactamente, es lo que necesito.

        ' Referenciamos el formulario llamado FormDePrueba
        Dim frm As Form = GetForm("FormDePrueba")
    
        ' Obtener el objeto System.Type del formulario:
        Dim ty As Type = frm.GetType()
    
        ' Referenciar la propiedad (objeto PropertyInfo):
        '
        Dim pi As PropertyInfo = ty.GetProperty("NombrePropiedad1")
    
        ' Y por último, establecer su valor:
        '
        pi.SetValue(frm, "Valor alfanumérico")
    
        ' Referenciar la segunda propiedad (objeto PropertyInfo):
        '
        pi = ty.GetProperty("NombrePropiedad2")
        pi.SetValue(frm, valorInteger)
    
        ' Referenciar la tercera propiedad (objeto PropertyInfo):
        '
        pi = ty.GetProperty("NombrePropiedad3")
        pi.SetValue(frm, valorDecimal)
    

    Se comprende que las propiedades cuyos valores deseas asignar están declaradas como Public, porque si tienen una visibilidad no pública (Private, Friend), entonces tendrás que utilizar la siguiente sobrecarga del método SetValue para indicarle los correspondiente valores BindingFlags al parámetro invokeAttr:

    PropertyInfo.SetValue (Método) (Object, Object, BindingFlags, Binder, Object(), CultureInfo)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 3 de mayo de 2017 11:44
    Moderador

Todas las respuestas

  • Hola CM16

    Podrías aplicar Reflection 

    C# Reflection Tips: Data transformation using Reflection

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 2 de mayo de 2017 17:08
  • Muchas gracias por tu respuesta Brayan, tendrías algún ejemplo?
    martes, 2 de mayo de 2017 19:11
  • Hola,

    Claro que sí , te dejo dos links para que te sirvan de guía:

    Uno es relacionado al foro: Obtener todos los controles de los formularios de un proyecto por Reflection

    y otro documentación oficial: How to: Hook Up a Delegate Using Reflection

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 2 de mayo de 2017 21:25
  • "CM16" preguntó:

    > Necesito instanciar un form partiendo desde su nombre.

    Hola:

    Para ello te podría servir la función GetForm que encontrarás en el siguiente artículo:

    Mostrar un formulario conocimiento su nombre

    Dicha función te devolverá un objeto System.Windows.Forms.Form, es decir, un formulario normal y corriente que se corresponderá con el nombre del formulario pasado a la función:

    Si tu intención es referenciar un formulario llamado "FormDePrueba", obtendrías su referencia ejecutando:

       
    Dim FormDet As FormDePrueba = DirectCast(GetForm("FormDePrueba"), FormDePrueba)

    Se comprende que en tu aplicación existe un formulario llamado FormDePrueba.

    > El inconveniente que tengo, es que necesito pasarle valores
    > a las propiedades del FormDePrueba
    >
    > ¿Alguien me sabe como podría lograr esto?

    Como ya tienes la referencia al formulario FormDePrueba, le pasarías normalmente los valores a sus propiedades:

        FormDet.NombrePropiedad1 = valorString
    
        FormDet.NombrePropiedad2 = valorInteger
    
        FormDet.NombrePropiedad3 = valorDecimal
    

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 3 de mayo de 2017 11:05
    Moderador
  • Muchas gracias a usted también por su respuesta Enrique.

    La idea que tengo es la de dinamizar la carga de formularios, a partir de un string. Necesito además, pasarle valores a las propiedades de ese form.

    si no me equivoco, si yo realizo esto:

    Dim FormDet As FormDePrueba = DirectCast(GetForm("FormDePrueba"), FormDePrueba)

    debo especificar que pertenece a la clase/Form FormDePrueba, algó que aún no lo sé porque debe ser dinámico

    miércoles, 3 de mayo de 2017 11:20
  • "CM16" preguntó:

    > si no me equivoco, si yo realizo esto:
    > Dim FormDet As FormDePrueba = DirectCast(GetForm("FormDePrueba"), FormDePrueba)
    >
    > debo especificar que pertenece a la clase/Form FormDePrueba, algó que aún no lo
    > sé porque debe ser dinámico

    Si no sabes cómo se llama el formulario dinámico, NO PUEDES convertirlo a un tipo de formulario concreto (Form1, Form23, FormDePrueba) mediante el operador DirectCast; tienes que trabajar con el tipo de dato Form:

        ' Referenciamos el formulario llamado FormDePrueba
        Dim FormDet As Form = GetForm("FormDePrueba")

    Pero si las propiedades que deseas asignar no pertenecen a la clase base Form, entonces tendrías que utilizar la reflexión para crear una instancia del tipo de formulario concreto y asignarle, también mediante reflexión, el valor a sus propiedades.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 3 de mayo de 2017 11:30
    Moderador
  • Exactamente, es lo que necesito. Agradecería mucho su ayuda, mientras tanto sigo leyendo... Muchas gracias.
    miércoles, 3 de mayo de 2017 11:34
  • "CM16" escribió:

    > Exactamente, es lo que necesito.

        ' Referenciamos el formulario llamado FormDePrueba
        Dim frm As Form = GetForm("FormDePrueba")
    
        ' Obtener el objeto System.Type del formulario:
        Dim ty As Type = frm.GetType()
    
        ' Referenciar la propiedad (objeto PropertyInfo):
        '
        Dim pi As PropertyInfo = ty.GetProperty("NombrePropiedad1")
    
        ' Y por último, establecer su valor:
        '
        pi.SetValue(frm, "Valor alfanumérico")
    
        ' Referenciar la segunda propiedad (objeto PropertyInfo):
        '
        pi = ty.GetProperty("NombrePropiedad2")
        pi.SetValue(frm, valorInteger)
    
        ' Referenciar la tercera propiedad (objeto PropertyInfo):
        '
        pi = ty.GetProperty("NombrePropiedad3")
        pi.SetValue(frm, valorDecimal)
    

    Se comprende que las propiedades cuyos valores deseas asignar están declaradas como Public, porque si tienen una visibilidad no pública (Private, Friend), entonces tendrás que utilizar la siguiente sobrecarga del método SetValue para indicarle los correspondiente valores BindingFlags al parámetro invokeAttr:

    PropertyInfo.SetValue (Método) (Object, Object, BindingFlags, Binder, Object(), CultureInfo)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 3 de mayo de 2017 11:44
    Moderador