none
treeview的node.name 同form.name一样,如何在TreeView1_NodeMouseDoubleClick事件中,能依据treeview节点名字自动加载对应名称的窗体? RRS feed

  • 问题

  • treeview1控件放在mdi窗体中,treeview1节点是整个系统的功能树,实现思路是,双击treeview1的节点,加载相应的窗体,我把treeview的各节点的name 同各个子窗体的name设为一样,如何在TreeView1_NodeMouseDoubleClick事件中,能依据名字自动加载对应名称的窗体?我现在只能是对比节点名和窗体名,这样如果功能树中的功能特别多,我下面的代码会非常长,有什么好办法,一条语句就实现吗?能在子窗体没有加载就可以遍例mdi窗体包含的各子窗体吗?那样对比节点名和窗体名的代码会特别简单了,只是不知道效率会不会低?我现在的代码如下:
    代码如下:
    Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick

     If e.Node.Name = "frm_department" Then  ‘节点名同窗体名对比
           Dim newfrm As New frm_department
           newfrm.Show()
      ElseIf e.Node.Name = "frm_person" Then    ‘节点名同窗体名对比
           Dim newfrm As New frm_person
            newfrm.Show()
         '还有很多功能项,我必须得把所有的窗体可能的对比情况全写出来。
    end sub
    • 已编辑 nswdwy 2009年8月20日 8:01
    2009年8月20日 7:59

答案

  • 这个时候可以用反射 

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
            f1.Show()
        End Sub
    End Class
    

    答案破千 马上就要到5星用户了 嘿嘿~~
    • 已标记为答案 feiyun0112Moderator 2009年8月21日 3:38
    • 取消答案标记 nswdwy 2009年8月21日 6:40
    • 已标记为答案 nswdwy 2009年8月25日 3:15
    2009年8月21日 3:20

全部回复

  • 难道没有办法实现吗?还是大家没看明白我表达的意思,这种功能树型界面在现在实际编程环境中是很常用的方式啊。

    2009年8月21日 0:31
  • 如果是找控件可以用Controls("xxx"),但找窗体就不知道了。
    2009年8月21日 2:40
  • 这个时候可以用反射 

    Public Class Form1
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
            f1.Show()
        End Sub
    End Class
    

    答案破千 马上就要到5星用户了 嘿嘿~~
    • 已标记为答案 feiyun0112Moderator 2009年8月21日 3:38
    • 取消答案标记 nswdwy 2009年8月21日 6:40
    • 已标记为答案 nswdwy 2009年8月25日 3:15
    2009年8月21日 3:20
  • 这个时候可以用反射 

    Public Class Form1
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    
        End Sub
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
    
    
            f1.Show()
    
        End Sub
    
    End Class
    
    
    
    

    答案破千 马上就要到5星用户了 嘿嘿~~

    没明白你的WindowsApplication5.Form1什么意思,这样可以吗? 能更详细点吗?
    2009年8月21日 6:39
  • 这个时候可以用反射 

    Public Class Form1
    
    
    
    
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    
    
    
    
    
        End Sub
    
    
    
    
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
    
    
    
    
    
    
            f1.Show()
    
    
    
        End Sub
    
    
    
    End Class
    
    
    
    
    
    
    
    

    答案破千 马上就要到5星用户了 嘿嘿~~

    没明白你的WindowsApplication5.Form1什么意思,这样可以吗? 能更详细点吗?

    你的类都有一个与生俱来的  namespace  "工程名.类名"  比如你的 frm_department  在你的工程中  namespace  就是  "xxxxapp.frm_department"


    type.gettype  可以用这个唯一标示  生成一个类型的引用 
    Activator.CreateInstance 可以通过一个type 建立一个实例
    所以
    Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    就可以创建  WindowsApplication5这个工程中的 Form1类

    您可以用  ctrl + alt+J  打开对象管理器  确定你需要的的类的命名空间和名字  然后用


     Dim f1 As Form = Activator.CreateInstance(Type.GetType( "命名空间." + e.Node.Name))
    f1.show()

    产生一个指定的类型实例


    答案破千 马上就要到5星用户了 嘿嘿~~
    2009年8月21日 7:48
  • 这个时候可以用反射 

    Public Class Form1
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        End Sub
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
    
    
    
    
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            f1.Show()
    
    
    
    
    
    
    
        End Sub
    
    
    
    
    
    
    
    End Class
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    答案破千 马上就要到5星用户了 嘿嘿~~

    没明白你的WindowsApplication5.Form1什么意思,这样可以吗? 能更详细点吗?

    你的类都有一个与生俱来的  namespace  "工程名.类名"  比如你的 frm_department  在你的工程中  namespace  就是  "xxxxapp.frm_department"


    type.gettype  可以用这个唯一标示  生成一个类型的引用 
    Activator.CreateInstance 可以通过一个type 建立一个实例
    所以
    Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    就可以创建  WindowsApplication5这个工程中的 Form1类

    您可以用  ctrl + alt+J  打开对象管理器  确定你需要的的类的命名空间和名字  然后用


     Dim f1 As Form = Activator.CreateInstance(Type.GetType( "命名空间." + e.Node.Name))
    f1.show()

    产生一个指定的类型实例


    答案破千 马上就要到5星用户了 嘿嘿~~

    我把你上述代码改一下命名空间复制到TreeView1_NodeMouseDoubleClick事件中,出错了,标题栏是:argumentnullexception,
    内容为:值不能为空
                参数名:type
    2009年8月21日 8:07
  • 说明你的类名找不到

    试试这样报不报错,看命名空间对不对
    dim frm as  WindowsApplication1.Form1
    http://feiyun0112.cnblogs.com/
    2009年8月25日 2:06
    版主
  • 这个时候可以用反射 

    Public Class Form1
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        End Sub
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            f1.Show()
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        End Sub
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    End Class
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    答案破千 马上就要到5星用户了 嘿嘿~~

    没明白你的WindowsApplication5.Form1什么意思,这样可以吗? 能更详细点吗?

    你的类都有一个与生俱来的  namespace  "工程名.类名"  比如你的 frm_department  在你的工程中  namespace  就是  "xxxxapp.frm_department"


    type.gettype  可以用这个唯一标示  生成一个类型的引用 
    Activator.CreateInstance 可以通过一个type 建立一个实例
    所以
    Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    就可以创建  WindowsApplication5这个工程中的 Form1类

    您可以用  ctrl + alt+J  打开对象管理器  确定你需要的的类的命名空间和名字  然后用


     Dim f1 As Form = Activator.CreateInstance(Type.GetType( "命名空间." + e.Node.Name))
    f1.show()

    产生一个指定的类型实例


    答案破千 马上就要到5星用户了 嘿嘿~~

    我把你上述代码改一下命名空间复制到TreeView1_NodeMouseDoubleClick事件中,出错了,标题栏是:argumentnullexception,
    内容为:值不能为空
                参数名:type
    您可以用  ctrl + alt+J  打开对象管理器  确定你需要的的类的命名空间和名字 

    答案破千 马上就要到5星用户了 嘿嘿~~
    2009年8月25日 2:32
  •   我的以下代码有错吗?但为什么报错:错误框标题栏是:argumentnullexception,
                                                                        内容为:值不能为空
                                                                            参数名:type

    我的根命名空间确实是blsqgz,为什么不能执行呢?需要改vb2005的某个系统选项吗?还是某个参数开关?
    需要 imports .....什么吗?
        Private Sub TreeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
          
            Dim newfrm  As Form = Activator.CreateInstance(Type.GetType("blsqgz."+e.node.name))  '根命名空间blsqgz
            newfrm.Show()
    end sub
    • 已编辑 nswdwy 2009年8月25日 3:07 补充
    2009年8月25日 3:05
  • 2009年8月25日 3:08
    版主
  • 谢谢各位,解决了,犯了低级错误,窗体名大小写的问题 ,节点全是小写, 但窗体名有大写有小写,如节点名:frm_department, 窗体名Frm_department, 所以出问题了。非常感谢大家。
    2009年8月25日 3:12
  • e.node.name=?
    http://feiyun0112.cnblogs.com/

    谢谢您, feiyun0112,  还有 韦恩卑鄙 , 谢谢你们。
    2009年8月25日 3:14
  • [code]
    Dim f1 As Form = Activator.CreateInstance(Type.GetType("WindowsApplication5.Form1"))
    [/code]

    2009年11月19日 19:15