当前位置:编程学习 > C#/ASP.NET >>

vb.net 只要打开一个子窗口

我想在vb.net(from)中只要打开一个子窗口,同样的子窗口不让打开,怎么办呢?
--------------------编程问答--------------------   bool OpenOnce(Form frm)
        {
            foreach (Form mdifrm in this.MdiChildren)
            {
                if (frm.Name == mdifrm.Name)
                {
                    mdifrm.Activate();
                    return false;
                }
            }
            return true;
        } --------------------编程问答-------------------- 简单方法:

'调用
If OpenOnce(Form2) = False Then
    FormToShow.MdiParent = Me
    FormToShow.Show()
End If

'检查MDI是否已运行,是返回true
Private Function OpenOnce(ByVal myform As Form) As Boolean
    Dim frm As Form
    For Each frm In Me.MdiChildren
        If InStr(frm.Text, myform.Text) > 0 Then
            frm.Activate()
            Return True
        End If
    Next
    Return False
End Function --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- If OpenOnce(Form2) = False Then 
    FormToShow.MdiParent = Me 
    FormToShow.Show() 
End If
先定义一个窗体用上面的这个加载就可以了.根本不用判断. --------------------编程问答--------------------
引用 5 楼 zanfeng 的回复:
If OpenOnce(Form2) = False Then  
    FormToShow.MdiParent = Me  
    FormToShow.Show()  
End If 
先定义一个窗体用上面的这个加载就可以了.根本不用判断.


 不错,可以试试 --------------------编程问答-------------------- 恩...吧我的c#代码转换成vb.....
--------------------编程问答-------------------- VB 2005及后续版本 提供了极其简单的方法 来解决楼主的问题:
试一试,在代码的任何地方书写:

My.Forms.Form1.Show()

--------------------编程问答-------------------- 根据字符打开特定窗口,避免重复加载:

    ''' <summary>
    ''' 打开Mdi窗体子窗体
    ''' </summary>
    ''' <param name="FormName"></param>
    ''' <param name="NewWindow"></param>
    ''' <param name="MaxWindow"></param>
    ''' <remarks></remarks>
    Public Function OpenWindow(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 MDIParent.MdiChildren.Length - 1
                tempChild = CType(MDIParent.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
        frm = CType(asm.CreateInstance("LDAsset." + FormName), Form)
        frm.MdiParent = MDIParent
        frm.StartPosition = FormStartPosition.Manual
        If MaxWindow = True Then    '先设置状态并不好用的~~
            frm.WindowState = FormWindowState.Maximized
        End If
        frm.Show()
        Return frm
    End Function

││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤  --------------------编程问答-------------------- 楼上说的
My.Forms.FilterWin.Show()
My.Forms.FilterWin.Focus()
这在VS2005中是可行的,但是可控性必然差了点。
--------------------编程问答-------------------- 留個腳印,最近正好在學習MDI的東西。 --------------------编程问答-------------------- 五钻!!哈哈 --------------------编程问答-------------------- 有那么麻烦?用ShowDialog不就只打开一个窗口吗,父窗体都不让操作,还怎么打开子窗体了 --------------------编程问答-------------------- 如果是winfor
那就用ShowDialog这个方法把
这个只允许打开的窗体进行操作
关闭之后
继续执行ShowDialog之后的代码 --------------------编程问答-------------------- Dim myFrm
myFrm = New form1
myFrm.MdiParent = Me
myFrm.Show()

如果是上面这样显示的话,每次打开都要初始化,所以会重复打开。


可以直接在按钮或菜单里面用下面的代码:

form1.MdiParent = Me
form1.Show() --------------------编程问答-------------------- 很简单
dim frm as form
for each frm in me.mdichildren
if type frm is abcd then
frm.activate()
exit sub 
next
dim frm as new abcd
frm.mdiparent=me                    
frm.show()                       'abcd 是你的窗口的名
--------------------编程问答-------------------- 嗯,先占一个位,前一段时间也在找类似的解决方案.
后来干脆所有的界面都单独显示了.

以后再需要用的时候来这儿查吧,
先留个记号 --------------------编程问答-------------------- 还有一种方法用定义一个静态属性(以FORM2为例):
在FORM2中定义如下:
private shared ms_frmMe as form2

private shared readonly property DefInstance as form2
if ms_frmMe is nothing orelse ms_frmMe.isdisposed then'注意一定两条件次序不能换,而且一定要用orelse连接(不能用OR)
ms_frmMe=new form2
end if
return ms_frmMe
end property

调用它的时候:
form2.definstance.show
form2.bringtofront
就可以了. --------------------编程问答-------------------- 谢谢大家。 --------------------编程问答--------------------   ‘在菜单项里加
 If GetInstanceState("子窗体名") Then
            Exit Sub
 Else
      

 ’执行菜单命令
 
End If




    '判断子窗体是否运行
    Private Function GetInstanceState(ByVal name As String) As Boolean
        '获得子窗体的数量   
        Dim i As Integer = Me.MdiChildren.Length
        For i = 0 To Me.MdiChildren.Length - 1
            If Me.MdiChildren(i).Name = name Then
                '存在名为name的了窗体,子窗体获得焦点返回true
                Me.MdiChildren(i).Focus()
                Return True
            End If
        Next
        '不存在名为name的子窗体,返回false
        Return False
    End Function --------------------编程问答-------------------- 重写子窗口的init函数

用互斥

           mobjMutex = New Mutex(False, Me.MutexName)
          If Not mobjMutex.WaitOne(0, False) Then     
                Throw New System.ApplicationException("已经启动")
          End If
 
MutexName可以用 前缀+apId的方式。 --------------------编程问答-------------------- 模块级别申明
shared f1 as form1

在子程序中输入如下代码

F1=FORM1
F1.SHOW --------------------编程问答--------------------
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,