Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly()
        Dim frm As New Form
        Dim sss As String = "WLG.FrmMuDi"
        frm = CType(asm.CreateInstance((sss)), Form)
        frm.MdiParent = MDIForm
sss是随便设置的,首先这样写是好用的;
        Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly()
        Dim frm As New Form
        dim s  as string ="FrmMuDi"
        Dim sss As String = "WLG." & s
        frm = CType(asm.CreateInstance((sss)), Form)
        frm.MdiParent = MDIForm这样竟然是不好用的,跟踪的时候sss是正确的字符串组合——但是同样的字符串,返回的frm
一个是正常的窗体,一个就是Nothing,狂汗了~~大小写都没有区别。
因为这里是个Function,所以传进去一个窗体名称字符串,却出了这个问题——这个函数在其他系统内也没出现过这个现象啊跟踪到frm = CType(asm.CreateInstance((sss)), Form)
这里sss的值,两种写法是没有任何差异的,但是就是返回值不同组合出来的,就是出不来

解决方案 »

  1.   


    原函数写法    Public Function OpenWindow(ByVal MDIForm As MDIParent, ByVal FormName As String, Optional ByVal NewWindow As Boolean = False, Optional ByVal MaxWindow As Boolean = True) As Form
            '检查是否已经存在了
            Dim II As Integer, tempChild As Form
            If NewWindow = False Then
                For II = 0 To MDIForm.MdiChildren.Length - 1
                    tempChild = CType(MDIForm.MdiChildren(II), Form)
                    If tempChild.Name = FormName Then
                        tempChild.Focus() : Return tempChild
                    End If
                Next
            End If
            ' 也可以用反射动态加载其他的assembly   
            Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly()
            Dim frm As New Form
    '问题就在这里,一旦用FormName这个字符串,就会返回Nothing,汗了
            Dim s As String = FormName.ToString
            Dim sss As String = "WLG." & s
            frm = CType(asm.CreateInstance((sss)), Form)        frm.MdiParent = MDIForm
            frm.StartPosition = FormStartPosition.Manual
            If MaxWindow = True Then frm.WindowState = FormWindowState.Maximized
            frm.Show()
            Return frm
        End Function
      

  2.   

    问题找到了——用Button激发该函数就没有问题,用菜单引发它就是这样,谁能告诉我这是为什么呢??
       Private Sub MuDiMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MuDiMenuItem.Click
            OpenWindow(Me, "FrmMudi")  ‘无法打开新的窗口
        End Sub    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            OpenWindow(Me, "FrmMuDi")  '正常
        End Sub
      

  3.   

    "WLG." & s
     这是 与关系吧。。
    如果字符串拼接应该是“+
    VB 或者vb.net 应该一样吧
      

  4.   

    MDI窗体和Button1所在窗体的命名空间相同否?
      

  5.   


    都一样的呢,所以才很奇怪~~可惜我删除窗体没备份,呵呵,见了鬼的Bug
      

  6.   

    怀疑是原窗体的命名空间不对
    不过很好奇的是,你的
    asm拿来干嘛?好像没用的? ' 也可以用反射动态加载其他的assembly   
    Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly()
      

  7.   

    年龄比较大,思想很活跃。还和ivony在水源pk的。
    没错。就是你了。果然是你。
      

  8.   

    很久没看见LZ了。LZ贴的是VB.NET的代码,不过这里是C#版,呵呵。
      

  9.   

    LZ如果原来的代码还在,可以用 ILDASM 看看有什么区别。
      

  10.   

    你在代码中两次调用时,传入的字符串是不一样的!是否你贴上的代码写错了,源程序中是正常的?
    个人感觉不会有这么诡异的情况。

    FrmMudi
    FrmMuDi   Private Sub MuDiMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MuDiMenuItem.Click
            OpenWindow(Me, "FrmMudi")  ‘无法打开新的窗口
        End Sub    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            OpenWindow(Me, "FrmMuDi")  '正常
        End Sub
        Public Function OpenWindow(ByVal MDIForm As MDIParent, ByVal FormName As String, Optional ByVal NewWindow As Boolean = False, Optional ByVal MaxWindow As Boolean = True) As Form
            '检查是否已经存在了
            Dim II As Integer, tempChild As Form
            If NewWindow = False Then
                For II = 0 To MDIForm.MdiChildren.Length - 1
                    tempChild = CType(MDIForm.MdiChildren(II), Form)
                    If tempChild.Name = FormName Then
                        tempChild.Focus() : Return tempChild
                    End If
                Next
            End If
            ' 也可以用反射动态加载其他的assembly   
            Dim asm As [Assembly] = System.Reflection.Assembly.GetExecutingAssembly()
            Dim frm As New Form
    '问题就在这里,一旦用FormName这个字符串,就会返回Nothing,汗了
            Dim s As String = FormName.ToString
            Dim sss As String = "WLG." & s
            frm = CType(asm.CreateInstance((sss)), Form)        frm.MdiParent = MDIForm
            frm.StartPosition = FormStartPosition.Manual
            If MaxWindow = True Then frm.WindowState = FormWindowState.Maximized
            frm.Show()
            Return frm
        End Function
      

  11.   

    很久不见LZ ~ 难不成LZ真的犯了个大小写的错误
      

  12.   

    VB不太懂,要不,我学了VB再过来。。
      

  13.   

    这里是C#版块不过分真的很多 
    不会vb喔