您的位置:程序门 -> .net技术 -> c#



子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,怎么做?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


子窗体根据父窗体传递的参数及时更新,子窗体只被实例化一个,怎么做?[已结贴,结贴人:gengyu]
发表于:2007-01-12 11:30:49 楼主
在一个程序中,父窗体向子窗体传递参数,然后子窗体根据父窗体传递的参数及时更新显示的数据,子窗体只被实例化一个,怎么做?
发表于:2007-01-12 11:46:241楼 得分:20
这个方法能帮助你

http://blog.csdn.net/knight94/archive/2006/05/17/742324.aspx
发表于:2007-01-12 11:47:092楼 得分:20
由于在mdi中,子窗体会很多,那么在我以前一篇文章中所提到的方法就有些繁琐了。为了能适应多个子窗体,并对于每个子窗体只保留一个实例,那么我就用一个新的方法来替换,即用反射方法来作处理。

 

大致代码如下。

首先是通过子窗体类型名来判断是否打开新的子窗体,还是把原有的子窗体进行显示。

        using   system.reflection;

        ///   <summary>

        ///   open   child   window

        ///   </summary>

        ///   <param   name= "childtypestring "> </param>

        private   void   openwindow(   string   childtypestring   )

        {

                form   mychild   =   null;

                if(   !containmdichild(   childtypestring   )   )

                {

                        //   get   current   process   assembly

                        assembly   assembly   =   assembly.getEXECutingassembly();

 

                        //   create   data   type   using   type   string

                        type   typform   =   assembly.gettype(   childtypestring   );

 

                        //   create   object   using   type 's   "invokemember "   method

                        object   obj   =   typform.invokemember(

                                null,  

                                bindingflags.declaredonly   ¦  

                                bindingflags.public   ¦   bindingflags.nonpublic   ¦  

                                bindingflags.instance   ¦   bindingflags.createinstance,  

                                null,  

                                null,

                                null   );

 

                        //   show   child   form  

                        if(   obj   !=   null   )

                        {

                                mychild   =   obj   as   form;

                                mychild.mdiparent   =   this;

                                mychild.show();

                                mychild.focus();

                        }

                }

        }

 

        ///   <summary>

        ///   search   mdi   child   form   by   specific   type   string

        ///   </summary>

        ///   <param   name= "childtypestring "> </param>

        ///   <returns> </returns>

        private   bool   containmdichild(   string   childtypestring   )  

        {

                form   mymdichild   =   null;

                foreach(form   f   in   this.mdichildren)  

                {  

                        if(   f.gettype().tostring()   ==   childtypestring   )  

                        {  

                                //   found   it  

                                mymdichild   =   f;  

                                break;  

                        }  

                }  

 

                //   show   the   exist   form

                if(   mymdichild   !=   null)  

                {  

                        mymdichild.topmost   =   true;

                        mymdichild.show();  

                        mymdichild.focus();  

                        return   true;

                }  

                else

                        return   false;

        }

 

以上两部分就可以对于每个子窗体只创建一个实例。那么调用以上代码就非常简单了。

如:

        //open   a   mdi   child   form   which   type   named   "mdichild "

        openwindow(   typeof(   mdichild   ).tostring()   );


引用自愚翁的blog
发表于:2007-01-12 11:56:063楼 得分:20
楼上的主意不错,或者你可以把要传递的参数定义成静态变量,改变之后利用消息通知子窗体;
或者你把子窗体中要显示新参数的的控件什么的设置成public,在父窗体中直接“子窗体实例.控件.text=”,然后刷新就可以了;
不过这样你的子窗体就不能再给出新参数的时候实例化,应该在之前,用的时候判断一下实例化了没有,没有就实例化,否则就用上面的方法“子窗体实例.控件.text=”就可以了
发表于:2007-01-13 13:47:064楼 得分:0
我感觉第一个方法,就是静态变量改变之后利用消息通知子窗体不错,
可是如何实现呢?子窗体已经实例化后,如何还能接收到其它窗体,或者父窗体的消息,并更具消息进行某些操作呢
发表于:2007-01-13 13:49:265楼 得分:10
子窗体建立一个事件响应,如果父窗体更新,只要激发这个事件就可以了,其实就是设计模式中的注册发行模式
发表于:2007-01-13 13:53:226楼 得分:5
用singleton   ?
发表于:2007-01-13 13:57:437楼 得分:5
单件模式singleton
发表于:2007-01-13 14:56:548楼 得分:10
此问题最好的也是最简单的解决方法就是互斥体
bool   iscreated;
                        //创建一个互斥体,使窗体只能创建一个实例。
                        mutex   mutex   =   new   mutex(true,   "要创建的窗体名 ",   out   iscreated);
                        if   (iscreated)
                        {
                                form1   form1   =   new   form1();
                                form1.showdialog();
                                mutex.releasemutex();
                        }
发表于:2007-01-13 15:44:249楼 得分:10
usermanage   um   =   null;

                        if   (um   ==   null   ¦ ¦   um.isdisposed)
                        {
                                um   =   new   usermanage();
                                um.show();
                        }
                        um.focus();
                        um.topmost   =   true;
发表于:2007-01-31 12:44:4310楼 得分:0
可以参考以下代码:
http://ehuae.blog.163.com/blog/static/2697210200703103514129/


快速检索

最新资讯
热门点击