none
C# Mdi Show 子窗体不显示? RRS feed

  • 问题

  • 问题:子窗体1在关闭前,(PublicClass.canCreateKQ_form = true;//其余时间,其都是 false) ,子窗体1关闭,子窗体2要 Show 出来

    代码:

     

     

            private void timer1_Tick(object sender, EventArgs e)
            {
                if (PublicClass.canCreateKQ_form == true)
                {
                    PublicClass.canCreateKQ_form = false;
                    Start();
                }
            }
    
            private void Start()
            {
                MessageBox.Show("这句没用");//这句显示了,但下面代码的 form 却不显示,如何解决?
    
                KQ_Form form = new KQ_Form(__s);
                      form.MdiParent = this;//去掉这句后,form 可以显示了,但不是我想要的。
                form.Show();
                      报考勤.Enabled = true;
            }
    
    
    

     


    2011年12月23日 6:20

答案

  • 你好:)

    我创建了Form1(父窗体)和Form2(子窗体),但是一切工作正常——

    namespace WinFormCSharp
    {
        public partial class Form1 : Form
        {
            bool isShown = false;   //没有显示子窗体

            public Form1()
            {
                InitializeComponent();
            }

           

            private void Form1_Load(object senderEventArgs e)
            {
                
            }

            private void timer1_Tick(object senderEventArgs e)
            {
                //如果没有显示子窗体,则显示,并且停止Timer
                if (!isShown)
                {
                    Form2 frm2 = new Form2();
                    frm2.MdiParent = this;
                    isShown = true//已经显示,不要在出现了!
                    frm2.Show();

                    //可以的话,请关闭定时器(当然不关闭我这里也可以)
                    //timer1.Enabled = false;
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月23日 8:35
    版主
  • 十分感谢你的回复。我把我的业务逻辑说明一下:

    1。是使用的Mdi容器

    2。在菜单“报考勤”单击响应事件:

        a. 打开子窗体1,处理完毕后,在close()前,置PublicClass.canCreateKQ_form为 true

        b. 子窗体1关闭,随着 timer 的递增,如果发现PublicClass.canCreateKQ_form为真时,启动创建并显示子窗体2

    你的代码没问题,可我的代码貌似也没问题呀?但我的代码却无法 Show 出窗体2 来!

    注:如果去掉 form.MdiParent = this; 则窗体2就能被 Show 出来(当然不在Mdi容器内了,所以不是我所需要的),百思不得其解。。

    不妨就先按照我的代码思路你自己先改进一下看看呢,呵呵。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月24日 3:30
    版主
  • 另外,如果说,我的代码没有问题的话,是否可以说,这是C# Mdi 的一个Bug 呢?

    如果你怀疑是Bug,可以直接到http://connection.microsoft.com去反映。这个我不敢武断肯定。呵呵
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月25日 2:21
    版主
  • 斑竹给力鸭

    问题解决了吗?如果没有解决,请尝试不要手动创建Timer,而是直接拖拽一个Timer到窗体上,然后设置属性Enabled什么的试试看。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月27日 2:57
    版主
  • Start();

    后面调用一次:

    Application.DoEvents();

    试试


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年12月27日 5:54
    版主
  • Wei_Dong 朋友,

    请:

    1。新建一个解决方案,并添加一个MDI父窗体,再添加一 Program.cs :

        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new AttendanceMDIParent());
            }
        }

    使之能够运行。

    然后,在该MDIParent_Load(object sender, EventArgs e)

       {

             System.Timer.Timer atimer = new System.Timers.Timer();

             atimer.Elapsed += new ElapsedEventHandler(timer1_Tick);

             atimer.Interval = 500;//每半秒钟检查一下 PublicClass.k 是不是变成 true 了

             atimer.Enabled = true;

       }

    2。新建2个 Form: form1 和 form2

    3。添加一 PublicClass.cs类,里面有一个 public static bool k = false;用于传递参数的变量

    4。form1 里只有一个按钮,其单击事件:

       private void btn_Click(object sender,EventArgs e)

       {

             PublicClass.k = true;//为的是,在 form1关闭后启动 form2

             Close();//关闭 form1

       }

    5。MDI父窗体只有一个菜单AAA,其单击代码如下:

       private void AAA_Click(object sender, EventArgs e)

       {

             Form1 form1 = new Form1();

             form1.MdiParent = this;

             form1.Show();

       }

    6。

    private void timer1_Tick(object sender, eventArgs e)

    {

        if( PublicClass.k == true )

         {

              PublicClass.k = false;//只有在 form1 关闭时才会使其成为 true

             Form2 form2 = new Form2();

             form2.MdiParent = this;//请试下,有无这句是啥状况,光凭想当然是不行的,我就想要 form2 在Mdi父容器里的。独立于MDIParent 的 form2 不是我想要的。

             form2.Show();

         }

    }

     

     

    另外,你给的代码我也好好研究了,也运行了,不是我所要求的。在我的场景里依然行不通。


    对不起,我用VS2010完全可以实现你的功能!我也完全按照你的做了!请你留下你的Email,我把项目发过去!
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月27日 6:28
    版主
  • Hi Wei_Dong,

    谢谢你一直以来对社区的支持和对诸多社区成员的帮助, 在英文论坛我也看到过你的身影哟~
    对于这个帖子可不可以直接将你的project打包上传到诸如SkyDrive的地方, 以供发帖者去下载重现呢? 个人邮箱如果直接在此透露的话很有可能被恶意发送广告或其他垃圾信息.

    祝你快乐每一天, 
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月27日 9:10
    版主
  • 好感动啊

    wuyazhe也来了--- 老熟悉了!:-)

    明天我肯定在单位试之

    我公布下我的邮箱,如有可能,版主可在用过后删改掉:  yqzhanglu@hotmail.com

    试过之后再结好吗?万一不行还能再交流。

    我已经发送到hotmail邮箱,如果没有收到,请查看回收站或者垃圾箱,小心我的邮件没有被过滤……哈哈!
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月28日 0:53
    版主

全部回复

  • 你好:)

    我创建了Form1(父窗体)和Form2(子窗体),但是一切工作正常——

    namespace WinFormCSharp
    {
        public partial class Form1 : Form
        {
            bool isShown = false;   //没有显示子窗体

            public Form1()
            {
                InitializeComponent();
            }

           

            private void Form1_Load(object senderEventArgs e)
            {
                
            }

            private void timer1_Tick(object senderEventArgs e)
            {
                //如果没有显示子窗体,则显示,并且停止Timer
                if (!isShown)
                {
                    Form2 frm2 = new Form2();
                    frm2.MdiParent = this;
                    isShown = true//已经显示,不要在出现了!
                    frm2.Show();

                    //可以的话,请关闭定时器(当然不关闭我这里也可以)
                    //timer1.Enabled = false;
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月23日 8:35
    版主
  • 十分感谢你的回复。我把我的业务逻辑说明一下:

    1。是使用的Mdi容器

    2。在菜单“报考勤”单击响应事件:

        a. 打开子窗体1,处理完毕后,在close()前,置PublicClass.canCreateKQ_form为 true

        b. 子窗体1关闭,随着 timer 的递增,如果发现PublicClass.canCreateKQ_form为真时,启动创建并显示子窗体2

    你的代码没问题,可我的代码貌似也没问题呀?但我的代码却无法 Show 出窗体2 来!

    注:如果去掉 form.MdiParent = this; 则窗体2就能被 Show 出来(当然不在Mdi容器内了,所以不是我所需要的),百思不得其解。。。

     

     



    2011年12月23日 11:33
  • 十分感谢你的回复。我把我的业务逻辑说明一下:

    1。是使用的Mdi容器

    2。在菜单“报考勤”单击响应事件:

        a. 打开子窗体1,处理完毕后,在close()前,置PublicClass.canCreateKQ_form为 true

        b. 子窗体1关闭,随着 timer 的递增,如果发现PublicClass.canCreateKQ_form为真时,启动创建并显示子窗体2

    你的代码没问题,可我的代码貌似也没问题呀?但我的代码却无法 Show 出窗体2 来!

    注:如果去掉 form.MdiParent = this; 则窗体2就能被 Show 出来(当然不在Mdi容器内了,所以不是我所需要的),百思不得其解。。

    不妨就先按照我的代码思路你自己先改进一下看看呢,呵呵。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月24日 3:30
    版主
  • 我家里没有装 VS ,明天到单位试下。暂时先不结帖了,请原谅哦。:)
    2011年12月25日 0:54
  • 另外,如果说,我的代码没有问题的话,是否可以说,这是C# Mdi 的一个Bug 呢?
    2011年12月25日 0:57
  • 另外,如果说,我的代码没有问题的话,是否可以说,这是C# Mdi 的一个Bug 呢?

    如果你怀疑是Bug,可以直接到http://connection.microsoft.com去反映。这个我不敢武断肯定。呵呵
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月25日 2:21
    版主
  • Wei_Dong 朋友,

    请:

    1。新建一个解决方案,并添加一个MDI父窗体,再添加一 Program.cs :

        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new AttendanceMDIParent());
            }
        }

    使之能够运行。

    然后,在该MDIParent_Load(object sender, EventArgs e)

       {

             System.Timer.Timer atimer = new System.Timers.Timer();

             atimer.Elapsed += new ElapsedEventHandler(timer1_Tick);

             atimer.Interval = 500;//每半秒钟检查一下 PublicClass.k 是不是变成 true 了

             atimer.Enabled = true;

       }

    2。新建2个 Form: form1 和 form2

    3。添加一 PublicClass.cs类,里面有一个 public static bool k = false;用于传递参数的变量

    4。form1 里只有一个按钮,其单击事件:

       private void btn_Click(object sender,EventArgs e)

       {

             PublicClass.k = true;//为的是,在 form1关闭后启动 form2

             Close();//关闭 form1

       }

    5。MDI父窗体只有一个菜单AAA,其单击代码如下:

       private void AAA_Click(object sender, EventArgs e)

       {

             Form1 form1 = new Form1();

             form1.MdiParent = this;

             form1.Show();

       }

    6。

    private void timer1_Tick(object sender, eventArgs e)

    {

        if( PublicClass.k == true )

         {

              PublicClass.k = false;//只有在 form1 关闭时才会使其成为 true

             Form2 form2 = new Form2();

             form2.MdiParent = this;//请试下,有无这句是啥状况,光凭想当然是不行的,我就想要 form2 在Mdi父容器里的。独立于MDIParent 的 form2 不是我想要的。

             form2.Show();

         }

    }

     

     

    另外,你给的代码我也好好研究了,也运行了,不是我所要求的。在我的场景里依然行不通。

    2011年12月26日 1:30
  • 另外,针对我的这种需求,Wei_Dong 朋友能否给提供一个得到同步数据的更好的方法吗?多谢了。
    2011年12月26日 1:37
  • 斑竹给力鸭
    2011年12月26日 8:27
  • 斑竹给力鸭

    问题解决了吗?如果没有解决,请尝试不要手动创建Timer,而是直接拖拽一个Timer到窗体上,然后设置属性Enabled什么的试试看。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月27日 2:57
    版主
  • 问题没有得到解决。以上代码全部都是控件的拖动做出的。Timer 控件也是拖动出来的,其 Tick 也是 Timer 事件自带的。。。

    请按我前面提到的 MdiParent 的过程做一遍,好不?

    其实,我的要求只是一个:子窗体1在关闭时,Show 出子窗体2(且都在 MdiParent 容器内)

    注:子窗体1是确定日期的,子窗体2则依据该日期填报这个日期的考勤报表的。

    2011年12月27日 5:47
  • Start();

    后面调用一次:

    Application.DoEvents();

    试试


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年12月27日 5:54
    版主
  • 问题没有得到解决。以上代码全部都是控件的拖动做出的。Timer 控件也是拖动出来的,其 Tick 也是 Timer 事件自带的。。。

    请按我前面提到的 MdiParent 的过程做一遍,好不?

    其实,我的要求只是一个:子窗体1在关闭时,Show 出子窗体2(且都在 MdiParent 容器内)

    注:子窗体1是确定日期的,子窗体2则依据该日期填报这个日期的考勤报表的。


    请你把你的项目直接发送到我这里来(不要包含数据库)只是几个窗体的组合,我来测试看看(点击我的“给我写信”)
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年12月27日 6:00
    版主
  • Wei_Dong 朋友,

    请:

    1。新建一个解决方案,并添加一个MDI父窗体,再添加一 Program.cs :

        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new AttendanceMDIParent());
            }
        }

    使之能够运行。

    然后,在该MDIParent_Load(object sender, EventArgs e)

       {

             System.Timer.Timer atimer = new System.Timers.Timer();

             atimer.Elapsed += new ElapsedEventHandler(timer1_Tick);

             atimer.Interval = 500;//每半秒钟检查一下 PublicClass.k 是不是变成 true 了

             atimer.Enabled = true;

       }

    2。新建2个 Form: form1 和 form2

    3。添加一 PublicClass.cs类,里面有一个 public static bool k = false;用于传递参数的变量

    4。form1 里只有一个按钮,其单击事件:

       private void btn_Click(object sender,EventArgs e)

       {

             PublicClass.k = true;//为的是,在 form1关闭后启动 form2

             Close();//关闭 form1

       }

    5。MDI父窗体只有一个菜单AAA,其单击代码如下:

       private void AAA_Click(object sender, EventArgs e)

       {

             Form1 form1 = new Form1();

             form1.MdiParent = this;

             form1.Show();

       }

    6。

    private void timer1_Tick(object sender, eventArgs e)

    {

        if( PublicClass.k == true )

         {

              PublicClass.k = false;//只有在 form1 关闭时才会使其成为 true

             Form2 form2 = new Form2();

             form2.MdiParent = this;//请试下,有无这句是啥状况,光凭想当然是不行的,我就想要 form2 在Mdi父容器里的。独立于MDIParent 的 form2 不是我想要的。

             form2.Show();

         }

    }

     

     

    另外,你给的代码我也好好研究了,也运行了,不是我所要求的。在我的场景里依然行不通。


    对不起,我用VS2010完全可以实现你的功能!我也完全按照你的做了!请你留下你的Email,我把项目发过去!
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月27日 6:28
    版主
  • Hi Wei_Dong,

    谢谢你一直以来对社区的支持和对诸多社区成员的帮助, 在英文论坛我也看到过你的身影哟~
    对于这个帖子可不可以直接将你的project打包上传到诸如SkyDrive的地方, 以供发帖者去下载重现呢? 个人邮箱如果直接在此透露的话很有可能被恶意发送广告或其他垃圾信息.

    祝你快乐每一天, 
    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us
    2011年12月27日 9:10
    版主
  • 好感动啊

    wuyazhe也来了--- 老熟悉了!:-)

    明天我肯定在单位试之

    我公布下我的邮箱,如有可能,版主可在用过后删改掉: xxxxxxxxxxxxx.xxx

    试过之后再结好吗?万一不行还能再交流。


    2011年12月27日 12:10
  • 好感动啊

    wuyazhe也来了--- 老熟悉了!:-)

    明天我肯定在单位试之

    我公布下我的邮箱,如有可能,版主可在用过后删改掉:  yqzhanglu@hotmail.com

    试过之后再结好吗?万一不行还能再交流。

    我已经发送到hotmail邮箱,如果没有收到,请查看回收站或者垃圾箱,小心我的邮件没有被过滤……哈哈!
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月28日 0:53
    版主
  • 我已经发送到hotmail邮箱,如果没有收到,请查看回收站或者垃圾箱,小心我的邮件没有被过滤……哈哈!
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    邮件收到

    我的电脑一开就是一星期,不知从何时起,IE上就打不上汉字了,今天重新启动了一下,试验了下你我的代码,都OK,看来我得重新好好仔细检查下我的那个程序的各个细节了---定点都马虎不得阿---感谢大家的帮助!

    leo真缜密,想的那么周全,让人感受到了MS不会弄明文用户名和密码的东西,MS帝国名不虚传

    wuyazhe早在CSDN上就熟悉,曾经并且在现在都给了我很大的帮助

    特别感谢Wei_Dong朋友,貌似不是MS的官员和论坛管理员,但却那么热心肠且又耐心帮人解答各种问题,让人敬佩(说过多的溢美之词或许让人觉得虚伪,那就不多说了,我心中永远都会铭记君)。

    2011年12月28日 1:37
  • 特别感谢Wei_Dong朋友,貌似不是MS的官员和论坛管理员,但却那么热心肠且又耐心帮人解答各种问题,让人敬佩(说过多的溢美之词或许让人觉得虚伪,那就不多说了,我心中永远都会铭记君)。

    不用谢!希望你可以多多来MSDN论坛也交流和帮助别人哟!

    另外附带说一下:请是否可以仔细看看你标记的答案,非直接提供答案的就不要标记为答案了,谢谢。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月28日 1:44
    版主
  • 特别感谢Wei_Dong朋友,貌似不是MS的官员和论坛管理员,但却那么热心肠且又耐心帮人解答各种问题,让人敬佩(说过多的溢美之词或许让人觉得虚伪,那就不多说了,我心中永远都会铭记君)。

    不用谢!希望你可以多多来MSDN论坛也交流和帮助别人哟!

    另外附带说一下:请是否可以仔细看看你标记的答案,非直接提供答案的就不要标记为答案了,谢谢。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    呵呵,刚来这里混,好多东西都不懂,明白了,这就改之。
    2011年12月28日 1:52