VC#中经常出现多个模块之间属性传递的问题,我最近就遇见一个MDI下的自定义控件的引用问题
问题描述
1,工程是一个MDI窗体,父窗体中有多个MDI子窗体和工具栏菜单
2,有一个自定义控件,是属于MDI子窗体的,比如说这个MDI子窗体叫A,这个自定义控件叫a
3,想在a中调用MDI父窗体的一个菜单按钮事件
以上是我遇到的问题,最后给出解决方案共享
方案如下:
1添加一个全局的属性 ,也就是在A上(mdi窗体)
1
MDIParent mdiFrame
=
null
;
2 public fomCustomer(MDIParent m)
3 {
4 mdiFrame = m;
5
2 public fomCustomer(MDIParent m)
3 {
4 mdiFrame = m;
5
2,加载自定义控件
usCustomerQuery CustomerQuery
=
new
usCustomerQuery(mdiFrame);
//
注意这里加载了属性mdiframe
CustomerQuery.Parent = this ;
CustomerQuery.Dock = DockStyle.Fill;
CustomerQuery.Show();
CustomerQuery.Parent = this ;
CustomerQuery.Dock = DockStyle.Fill;
CustomerQuery.Show();
3,自定义控件的初始化,也就是属性传递
1
public
MDIParent mdi
=
null
;
2 public usCustomerQuery(MDIParent m)
3 {
4 InitializeComponent();
5 mdi = m; // 这里,我们就可以用Mdi变量引用父窗体的所有函数了
6 }
7
2 public usCustomerQuery(MDIParent m)
3 {
4 InitializeComponent();
5 mdi = m; // 这里,我们就可以用Mdi变量引用父窗体的所有函数了
6 }
7
4,引用
1
private
void
pbox_Return_Click(
object
sender, EventArgs e)
2 {
3 if (mdi != null )
4 mdi.NavMenuItem_Click(sender,e); // 引用了父窗体中NavMenuItem菜单的处理方法
5 }
6
2 {
3 if (mdi != null )
4 mdi.NavMenuItem_Click(sender,e); // 引用了父窗体中NavMenuItem菜单的处理方法
5 }
6
总结:
这里是MDI父-MDI子-MDI子中的自定义控件,这三层引用。由于都是动态引用,造成MDI父的方法不能被MDI子中自定义控件直接引用,所以要通过一个共同的属性来传递,这个属性也可以理解为C++中的指针或者句柄。刚用C#的确有点不习惯,好在是解决了。呵呵