首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于子窗体调用父窗体函数有关问题

2013-09-07 
关于子窗体调用父窗体函数问题请教各位大侠个问题,我有一个MainFrm 和通过MainFrm窗口菜单弹出一个ChildFr

关于子窗体调用父窗体函数问题
请教各位大侠个问题,我有一个MainFrm 和通过MainFrm窗口菜单弹出一个ChildFrm;现在问题是ChildFrm窗口中的一个按钮调用MainFrm窗口中的一个IniCon函数(为初始化MainFrm上一个控件的函数),若按钮采用MainFrm dlg=new MainFrm();
dlg.IniCon();
的写法,需要加载MainFrm其他的加载项(MainFrm在初始化时还需要加载大量的数据的),则会显得很慢,有什么好的解决方法吗?
[解决办法]
http://bbs.csdn.net/topics/360140208
[解决办法]
重载一个构造函数就行了。
MainFrm dlg=new MainFrm(this);
[解决办法]


        private void button1_Click(object sender, EventArgs e)
        {
            FrmOne dlg = new FrmOne(this);
            dlg.ShowDialog();
        }
        public void ShowMsg(string msg)
        {
            MessageBox.Show(msg);
        }

/////////////////////////////////////////////////////////////

        public FrmOne(Form1 form1)
        {
            InitializeComponent();

            this.form1 = form1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.form1.ShowMsg(typeof(FrmOne).Name);
        }

[解决办法]
别忘记定义这个:        

private Form1 form1;
------解决方案--------------------



MainFrm
    click:
         Child c=new Child();
         c.SetParentCtl+=SetParentCtlHandler;
         c.Show();
    
    private void SetParentCtlHandler(object sender,EventArgs e)
    {
        IniCon();
    }

//////////////////////////////////////
ChildFrm
    public event EventHandler SetParentCtl;
    
    click:
        if(SetParentCtl!=null) SetParentCtl(this,null);

[解决办法]
MainFrm dlg=new MainFrm();
dlg.IniCon();这样实现应该是不行的,这里new了一个MainForm和你的主窗口不是一个Object了。

如果IniCon不依赖于MainForm实例,把他封装到其他类中去,可以做成静态,MainForm和ChildForm都调用它。

如果依赖于MainForm实例,最好使用Observer模式,也就是在ChildForm中定义是个Event,在MainForm中订阅这个Event,并执行IniCon。 这样做的好处是ChildForm不必依赖于MainForm,一定程度上的解耦,而且一般最好不要出现循环引用。



热点排行