首页 > 其他分享 >WinForm窗体应用——父窗体每次只打开一个子窗体的方法

WinForm窗体应用——父窗体每次只打开一个子窗体的方法

时间:2022-12-13 14:47:23浏览次数:53  
标签:ChildFrm Show 每次 打开 childFrm 窗体 null WinForm

C#在父窗口中调用子窗口的过程: 1、 创建子窗口对象 2、 显示子窗口对象   如图所示,点击Form1中的按钮,打开ChildFrm窗体。

 

 第一种方案:

private void btnOpenChildFrm_Click(object sender, EventArgs e)
{
    ChildFrm childFrm = new ChildFrm();
    childFrm.Show();
}

这种方法的可以实现子窗体的打开,但是每次点击按钮都可以打开一个子窗体。

我们有时候需要的是这样一种情况:

点击按钮打开一个子窗体,如果子窗体已经打开,则不再创建子窗体。也就是说只能打开一个子窗体,不能重复打开多个子窗体。

 

第二种方案:

ChildFrm childFrm = null;
private void btnOpenChildFrm_Click(object sender, EventArgs e)
{
    if (childFrm != null)
    {
        childFrm.Show();
    }
    else
    {
        childFrm = new ChildFrm();
        childFrm.Show();
    }
}

这样做,当打开一个子窗体后,在不关闭子窗体的情况下,再次点击“打开子窗体”按钮,不会再重新打开子窗体。

但是当子窗体关闭后,再点击“打开子窗体”按钮发生报错。错误信息如下:

 

这就让人奇怪了。如果子窗口没有被销毁,那它就应该能够正确显示。点击了关闭子窗口,显然应该子窗口已经销毁了,按理ChildFrm等于null,运行的时候应该直接运行else后面的语句块,为什么却进入了满足myChildFrm!=null的语句块呢?

参考“从小处看C#.net垃圾回收”一文。

这里报错的问题主要是,ChildFrm已经关闭且回收,但是ChildFrm并不等于Null的问题。解决方法如下:

        ChildFrm childFrm = null;
        private void btnOpenChildFrm_Click(object sender, EventArgs e)
        {
            if (childFrm != null)
            {
                if (childFrm.IsDisposed)
                {
                    childFrm = new ChildFrm();
                }
                childFrm.Show();
            }
            else
            {
                childFrm = new ChildFrm();
                childFrm.Show();
            }
        }

将两个if语句也做一下简化,如下:

        ChildFrm childFrm = null;
        private void btnOpenChildFrm_Click(object sender, EventArgs e)
        {
            if (childFrm == null || childFrm.IsDisposed)
            {
                childFrm = new ChildFrm();
                childFrm.Show();
            }
            else
            {
                childFrm.Show();
            }
        }

 

 

标签:ChildFrm,Show,每次,打开,childFrm,窗体,null,WinForm
From: https://www.cnblogs.com/hanzq/p/16978697.html

相关文章

  • Winform DevExpress控件库(三) 使用NavBarControl控件定制导航栏
    NavBarControl控件:主要作用是制作包含多个选项组并且每个组里包含多个子选项的导航栏;位于工具箱->Navigation&Layout(导航栏与布局类控件)在工具箱输入名称NavBarControl......
  • 解决WinForm FolderBrowserDialog没有左侧快捷导航栏导致易用性差的问题
    通过nuget安装包:Microsoft.WindowsAPICodePack-ShellCommonOpenFileDialogdialog=newCommonOpenFileDialog();dialog.IsFolderPicker=true;dialog.ShowDialog();......
  • C# 使用多线程在关闭窗体时如何关闭所有线程,使程序退出不产生报错
    在winform开发中,程序内部使用了多线程或定时器等功能,在关闭窗体退出程序时,如果只有UI线程关闭,而托管线程还在运行就会报错。关闭线程的方法有以下几种,其中最彻底的方法为:S......
  • Qt开发:Windows 下进程间通信的可行桥梁:窗体消息SendMessage
    Qt开发:Windows下进程间通信的可行桥梁:窗体消息注:窗体消息仅适用于有窗口的进程,如果没有窗口是无法收到窗体消息的(哪怕是隐形的都可以),比如Qt中如果需要使用WindowsMessage......
  • WinForm(六)组合布局属性
    WinForm是基于控件的,不像code+mark的架构,可以非常灵活的用mark来布局,它只能用控件布局属性和窗口控件来完成对UI的布局。容器控件有一组控件叫容器控件,对布局特别有作......
  • WinForm(六)组合布局属性
    WinForm是基于控件的,不像code+mark的架构,可以非常灵活的用mark来布局,它只能用控件布局属性和窗口控件来完成对UI的布局。容器控件有一组控件叫容器控件,对布局特别有作用......
  • WinForm(六)组合布局属性
    WinForm是基于控件的,不像code+mark的架构,可以非常灵活的用mark来布局,它只能用控件布局属性和窗口控件来完成对UI的布局。容器控件有一组控件叫容器控件,对布局特别有作......
  • WinForm(五)控件和它的成员
    窗体无疑是WinForm的主角,每个窗体都是用一个class来承载,那么窗体的控件,就是类中的私有字段了。每个窗体有三个文件,两个.cs文件,是一个分部类,Designer.cs是自动生成的C#......
  • WinForm(五)控件和它的成员
    窗体无疑是WinForm的主角,每个窗体都是用一个class来承载,那么窗体的控件,就是类中的私有字段了。每个窗体有三个文件,两个.cs文件,是一个分部类,Designer.cs是自动生成的C#代......
  • WinForm(四)一种实现登录的方式
    首先声明,这只是一种登录方式,并不是最好的方式,用这个例子为了说明登录窗体和Application的关系。在登录前,定义了用户实体,然后是一个通用的类,存放进程中当前登录的......