elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Abrir form usando una variable de cadena de caraceteres.(SOLUCIONADO)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Abrir form usando una variable de cadena de caraceteres.(SOLUCIONADO)  (Leído 8,542 veces)
ezugaru

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Abrir form usando una variable de cadena de caraceteres.(SOLUCIONADO)
« en: 14 Junio 2010, 18:53 pm »

 :-(
Que tal amigos? fijense que ando desarrollando una aplicacion con menús dinámicos en VB.Net , los menús me corren de maravilla, sin embargo mi problema viene en la conversion de el nombre del frm que se obtiene de la base de datos en tipo cadena a un objeto de tipo form que pueda usarse para invocar el formulario correcto.

Encontré varios códigos en internet, pero ninguno me ha funcionado, el que actualmente estoy trabajando es este:
Código:

Imports MySql.Data
Imports MySql.Data.MySqlClient
Imports System
Imports System.Reflection
Imports Microsoft.VisualBasic.CallType


Public Class Main

    Public user, idrol, iuseraccessmode As String

    Dim consulta As String
    Dim con As New MySqlConnection
    Dim comando As New MySqlCommand
    Dim adaptador As New MySqlDataAdapter
    Dim lector As MySqlDataReader
    Dim datos As New DataTable
    Dim mnMenu As MenuStrip

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        LoginForm1.Close()
        'MsgBox(iuseraccessmode)

        con = New MySqlConnection
        con.ConnectionString = "server = 192.168.1.3;" & "user = zzzzzzzz;" & "password = xxxxxxxxx;" & "database = xxxxxx;"

        Try

            con.Open()

            consulta = "Select menutext from menumaster Where mainmenu = 0" & _
                   " And menuid in (Select menuid from acceso Where idrol =" & _
                    CInt(iuseraccessmode) & ") " & _
                    "And isActive = 1"
            comando.Connection = con
            comando.CommandText = consulta
            lector = comando.ExecuteReader

            If lector.HasRows Then

                mnMenu = New MenuStrip

                While lector.Read()

                    mnMenu.Items.Add(lector(0).ToString, Nothing, New System.EventHandler(AddressOf MainMenu_OnClick))
                    Me.Controls.Add(mnMenu)

                End While
            End If

            lector.Close()

        Catch ex As Exception

            MsgBox("El siguiente error fue detectado: " & ex.Message.ToString, MsgBoxStyle.Critical)

        End Try

        con.Close()

    End Sub

    Private Sub MainMenu_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim cms As New ContextMenuStrip()
        Dim sMenu() As String
        con = New MySqlConnection
        con.ConnectionString = "server = 192.168.1.3;" & "user = xxxxxxxx;" & "password = xxxxxxxx;" & "database = xxxxxxxx;"

        Try

            con.Open()

            consulta = "Select menuid from menumaster Where menutext = '" & sender.ToString & "'"
            comando.Connection = con
            comando.CommandText = consulta
            lector = comando.ExecuteReader

            Dim parentMenuID As Integer

            If lector.HasRows Then
                lector.Read()
                parentMenuID = lector("menuid")
            End If
            lector.Close()

            consulta = "Select menutext from menumaster Where mainmenu ='" & _
             parentMenuID & " '" & _
             "And isActive = 1" & _
             " And MenuID in (" & _
             "Select menuid from acceso Where idrol =" & _
             CInt(iuseraccessmode) & ")" & _
             " Order BY MenuOrder"
            comando.Connection = con
            comando.CommandText = consulta
            lector = comando.ExecuteReader

            ReDim Preserve sMenu(0)
            Dim i As Integer
            If lector.HasRows Then
                ReDim Preserve sMenu(0)
                i = 0
                While lector.Read()
                    ReDim Preserve sMenu(i)
                    sMenu(i) = lector("menutext")
                    i = i + 1
                End While
            End If
            lector.Close()
            For Each sMn As String In sMenu
                cms.Items.Add(sMn, Nothing, New System.EventHandler(AddressOf SelectedChildMenu_OnClick))
            Next
            Dim tsi As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
            tsi.DropDown = cms
            tsi.ShowDropDown()

        Catch ex As Exception

            MsgBox("El siguiente error fue detectado: " & ex.Message.ToString, MsgBoxStyle.Critical)

        End Try

        con.Close()

    End Sub

    Private Sub SelectedChildMenu_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
        
        Dim frmName As String
        'Dim frm As New Form

        con = New MySqlConnection
        con.ConnectionString = "server = 192.168.1.3;" & "user = xxxxxxxxx;" & "password = xxxxxxxxx;" & "database = xxxxxxx;"

        Try

            con.Open()
            consulta = "Select formname from menumaster Where menutext = '" & _
            sender.ToString & "'"
            comando.Connection = con
            comando.CommandText = consulta
            lector = comando.ExecuteReader

            If lector.HasRows Then

                lector.Read()
                frmName = lector(0).ToString
                lector.Close()

                Dim frm As Form = DynamicallyLoadedObject(frmName)
                frm.MdiParent = Me
                frm.Show()


            Else

                MsgBox("Under Construction", MsgBoxStyle.Exclamation, "Technical Error")

            End If

        Catch ex As Exception

            MsgBox("El siguiente error fue detectado: " & ex.Message.ToString, MsgBoxStyle.Critical)

        End Try

        con.Close()

    End Sub

    Private Function DynamicallyLoadedObject(ByVal objectName As String, _
        Optional ByVal args() As Object = Nothing) As Form
        Dim returnObj As Object = Nothing
        Dim Type As Type = Assembly.GetExecutingAssembly().GetType( _
            "SysROCAR." & objectName)
        If Type IsNot Nothing Then
            returnObj = Activator.CreateInstance(Type, args)
        End If
        Return returnObj
    End Function

End Class


Al darle click al menu que quiero abrir me manda el error: "Referencia a objeto no establecida como instancia de un objeto".

El problema empieza en la funion SelectedChildMenu_OnClick la cual manda un parametro a la funcion DynamicallyLoadedObject quien se encarga de el ensamblado de la cadena a objeto. Espero alguien pueda ayudarme porque ya me siento frustrado ... saludos.


« Última modificación: 15 Junio 2010, 04:27 am por ezugaru » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Abrir form usando una variable de cadena de caraceteres.
« Respuesta #1 en: 15 Junio 2010, 00:09 am »

hubiera sido mas facil poner solo el codigo necesario.

Nunca vi la funcion DynamicallyLoadedObject, pero aca entraria perfecto el tutorial de refelction que hizo nuestro amigo danger Introduccion a System.Reflection

Leelo y nos cuentas ;)


En línea

ezugaru

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Abrir form usando una variable de cadena de caraceteres.
« Respuesta #2 en: 15 Junio 2010, 03:56 am »

hubiera sido mas facil poner solo el codigo necesario.

Nunca vi la funcion DynamicallyLoadedObject, pero aca entraria perfecto el tutorial de refelction que hizo nuestro amigo danger Introduccion a System.Reflection

Leelo y nos cuentas ;)

De hecho antes de postear vi ese tuto, sin embargo, aun no llegan a lo que estoy usando que es el manejo de tipos (Type) y a parecer ese es mi problema, ya que cuanod declaro el tipo y trato de obtener el namespace junto con el form que quiero llamar, la variable de Type sale vacía, por eso es que no funciona, y es lo que ando tratando de resolver, he visto en otros foros, el msdn, pero hay mucho que me cuesta entender y otro poco que no es lo que necesito (al menos eso creo) por eso hice el post , a ver si alguien con conocimientos mas avanzados me podía orientar al respecto.
En línea

ezugaru

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Abrir form usando una variable de cadena de caraceteres.
« Respuesta #3 en: 15 Junio 2010, 04:17 am »

Resuelto, el problema se generaba porqueel NameSpace que obtuve por alguna razon era incorrecto, al usar el  MsgBox(Me.GetType().Namespace) obtuve el namespace correcto, y me di cuenta que me falta un guion bajo, y ya con eso funciono como debe, llamandome al Form que ya tenia hecho en modo de diseño. Anexo foto :D



Gracias a todos :D por echar un vistazo.

El codigo lo resumo, y solo estoy usando 4 lineas:

Código:

Dim frmToOpen As Form = Activator.CreateInstance(Type.GetType("SysROCAR_1._0." & frmName))

                frmToOpen = DirectCast(frmToOpen, Form)

                frmToOpen.MdiParent = Me

                frmToOpen.Show()

En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Abrir form usando una variable de cadena de caraceteres.(SOLUCIONADO)
« Respuesta #4 en: 15 Junio 2010, 05:37 am »

hubiera sido mas facil poner solo el codigo necesario.

Nunca vi la funcion DynamicallyLoadedObject, ..............
Cita de: ezugaru
Código
  1.    Private Function DynamicallyLoadedObject(ByVal objectName As String, _
  2.        Optional ByVal args() As Object = Nothing) As Form
  3.        Dim returnObj As Object = Nothing
  4.        Dim Type As Type = Assembly.GetExecutingAssembly().GetType( _
  5.            "SysROCAR." & objectName)
  6.        If Type IsNot Nothing Then
  7.            returnObj = Activator.CreateInstance(Type, args)
  8.        End If
  9.        Return returnObj
  10.    End Function
  11.  
Es el fail mas grande que hice en todo el foro :xD

Que bien que te haya salido!!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Efecto al abrir el Form
Programación Visual Basic
Nardo[N] 5 7,920 Último mensaje 10 Febrero 2011, 01:51 am
por Nardo[N]
Ayuda para comparar una cadena con el nombre de una variable int
Programación C/C++
dato000 6 5,718 Último mensaje 7 Marzo 2011, 11:54 am
por dato000
Guardar numeros de cadena en variable[python]
Scripting
Ricardo95 2 6,928 Último mensaje 13 Junio 2011, 23:22 pm
por Ricardo95
Enviar un Form usando Httprequest !!
.NET (C#, VB.NET, ASP)
TrashAmbishion 2 3,251 Último mensaje 13 Febrero 2013, 19:52 pm
por TrashAmbishion
Pasar variable al abrir form.
.NET (C#, VB.NET, ASP)
.:Weeds:. 3 3,329 Último mensaje 20 Enero 2014, 13:34 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines