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