我用C#做winfrom怎么能让一个窗口只弹出一次呀?(希望能有代码)

解决方案 »

  1.   

            private static bool poped = false;
            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    if (Form1.poped)
                    {
                        throw new Exception("Form has poped,and it can only poped once!");
                    }
                    else
                    {
                        Form1.poped = true;
                    }
                }
                catch (Exception ex)
                {
                    //your logic code
                }
            }
      

  2.   

    遍历所有已开窗口,
    存在则不弹出.  '----------------------------------------------------------------------------------------------
        ' @(f)
        ' 函数名    : FormOpen()
        ' 返回值    : 无
        ' 参数      : ARG1 - mainfrm
        '             ARG2 - OpenForm.
        '             ARG3 - iReOpen(需要选中记录后开启的Form,需要关闭当前Form,再重新开启一个Form).
        ' 功能说明  : 多Form模式打开Form,Form未开启则开启Form,否则不开启。
        '----------------------------------------------------------------------------------------------
        Public Function FormOpen(ByVal mainfrm As frmMainForm, ByVal OpenForm As Form, Optional ByVal iReOpen As Long = 0)
            Dim bIsOpen As Boolean
            bIsOpen = IsFormOpen(mainfrm, OpenForm.Name)
            If bIsOpen Then '未开启,直接开
                OpenForm.MdiParent = mainfrm
                OpenForm.Show()
            Else '已开启
                If iReOpen <> 0 Then
                    Dim i As Integer
                    For i = 0 To mainfrm.MdiChildren.Length - 1
                        If mainfrm.MdiChildren(i).Name = OpenForm.Name Then
                            mainfrm.MdiChildren(i).Close()
                        End If
                    Next
                    OpenForm.MdiParent = mainfrm
                    OpenForm.Show()
                End If
            End If
        End Function
      

  3.   

    最简单的方法,把实例化的放到外面
    如private frm1 objfrm1  = null;
    private void objfrm1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                objfrm1 = null;
            }使用时如下:
    code=C#]if (this.objfrm1== null)
                        {
                            this.objfrm1= new frm1(tag);
                            this.objfrm1.Closing += new CancelEventHandler(objfrm1_Closing);
                        } 
                        this.objfrm1.Show();[[/code]
      

  4.   

    遍历所有已开窗口,
    存在则不弹出.  '----------------------------------------------------------------------------------------------
        ' @(f)
        ' 函数名    : FormOpen()
        ' 返回值    : 无
        ' 参数      : ARG1 - mainfrm
        '             ARG2 - OpenForm.
        '             ARG3 - iReOpen(需要选中记录后开启的Form,需要关闭当前Form,再重新开启一个Form).
        ' 功能说明  : 多Form模式打开Form,Form未开启则开启Form,否则不开启。
        '----------------------------------------------------------------------------------------------
        Public Function FormOpen(ByVal mainfrm As frmMainForm, ByVal OpenForm As Form, Optional ByVal iReOpen As Long = 0)
            Dim bIsOpen As Boolean
            bIsOpen = IsFormOpen(mainfrm, OpenForm.Name)
            If bIsOpen Then '未开启,直接开
                OpenForm.MdiParent = mainfrm
                OpenForm.Show()
            Else '已开启
                If iReOpen <> 0 Then
                    Dim i As Integer
                    For i = 0 To mainfrm.MdiChildren.Length - 1
                        If mainfrm.MdiChildren(i).Name = OpenForm.Name Then
                            mainfrm.MdiChildren(i).Close()
                        End If
                    Next
                    OpenForm.MdiParent = mainfrm
                    OpenForm.Show()
                End If
            End If
        End Function
      

  5.   

     this.objfrm1.Closing += new CancelEventHandler(objfrm1_Closing); 
    这句话,是必要的,以防止你关闭窗体时,再次打开不能显示窗体
      

  6.   


     /// <summary>
            /// 打开MDI子窗体
            /// </summary>
            /// <param name="FrmNameSpace"></param>
            /// <param name="ChildTypeName"></param>
            private void OpenMdiChild(string FrmNameSpace, string ChildTypeName)
            {
                bool isOpen = false;
                foreach (Form frm in MdiChildren)
                {
                    if (frm.GetType().Name == ChildTypeName)
                    {
                        frm.Activate();
                        isOpen = true;
                        break;
                    }
                }
                if (!isOpen)
                {
                    string className = FrmNameSpace + "." + ChildTypeName;
                    Form Instance = (Form)Assembly.Load(FrmNameSpace).CreateInstance(className);
                    Instance.MdiParent = this;
                    Instance.Show();
                }
            }
            private void ActivateChild(string ChildName)
            {
                foreach (DevComponents.DotNetBar.TabItem  ti in this.tabStrip1.Tabs)
                {
                    if (ti.Text == ChildName)
                    {
                        if (this.tabStrip1.SelectedTab != ti)
                            this.tabStrip1.SelectedTab = ti;
                        break;
                    }
                }
            }另外一种办法,用在MDI窗体里的,请参考
      

  7.   

    try
    Form2 f2;
    private void Button1_Click(object sender, EventArgs e)
    {
        if (f2== null || f2.IsDisposed)
        {
            f2= new Form2();
            f2.Show();
        }
        else
        {
            f2.Activate();
        }
    }
      

  8.   

    lxcnn 
    try C# codeForm2 f2;
    private void Button1_Click(object sender, EventArgs e)
    {
        if (f2== null || f2.IsDisposed)
        {
            f2= new Form2();
            f2.Show();
        }
        else
        {
            f2.Activate();
        }

     
     
    这个是正解啊 
    就是要使用到模式设计里面的 单件模式
      

  9.   

    Form2 f2; 
    private void Button1_Click(object sender, EventArgs e) 

        if (f2== null  ¦ ¦ f2.IsDisposed) 
        { 
            f2= new Form2(); 
        } 
        f2.ShowDialog(); 

      

  10.   

    支持单间模式的专家注意了,楼主的要求是“让一个窗口只弹出一次”,而不是“让一个窗口只弹出一个”,
    我可以举出一个反例——用户在t1时刻关闭窗体的单件实例form1后,代码可以在稍后的t2时刻再次弹出form1。
    因此我个人认为单件模式在这里可能并不合适。
      

  11.   

    尝试下用ini或资源文件,如果要每次程序运行只能出现一次的话就在程序开始运行时创建frm的访问信息值并设为可访问,到frm加载时判断该frm可否访问,而在该frm撤销时更新信息为不能再访问;如果想要无论多少次运行程序的该frm都只能运行一次的话,在创建信息时多加判断是否存在,存在的或就跳过就ok了
      

  12.   

    我用的是记录句柄的方法,每次打开新窗口时关闭前一个窗口,如打开FORM1 过一段时间又要再次打开FORM1则先找到句柄,关闭前一个FORM1 然后打开新的FORM1。这样在数据更新后也能即时在新的FORM1中反映出来。楼主可以参考一下。
      

  13.   


            private void toolButtonFzDy_Click(object sender, EventArgs e)
            {
                DyFzForm fzdy = new DyFzForm();            foreach (Form mdifrm in this.OwnedForms)
                {
                    if (fzdy.Text == mdifrm.Text)
                    {
                        mdifrm.WindowState = FormWindowState.Normal;
                        mdifrm.Activate();
                        fzdy.Close();
                        return;
                    }
                }
                fzdy.Owner = this;
                fzdy.Show();
            }