读书人

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

发布时间: 2013-09-07 14:12:45 作者: rapoo

关于子窗体调用父窗体函数问题
请教各位大侠个问题,我有一个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,一定程度上的解耦,而且一般最好不要出现循环引用。



读书人网 >C#

热点推荐