c# usercontrol 内部如何调用主窗体里的函数
我自己定义了一个usercontrol,假设是a,放在一个窗体里面,假设类型是b,我想调用b里面的函数c,用下面的语法可以实现。((b)this.parent).c();...
我自己定义了一个usercontrol, 假设是a, 放在一个窗体里面,假设类型是 b, 我想调用b里面的函数c,用下面的语法可以实现。
((b)this.parent).c(); 但是问题是,这样就会破坏a的封装,如果我把a放到d窗体里面,又得改代码, 所以我想,可不可以在a的构造函数中传入一些参数,让a知道调用哪些函数,比如将一个函数作为参数传进去,但不知道该怎么实现。既不破坏a的封装,又可以调用父级窗体的特定函数,该如何实现,求高人指点! 展开
((b)this.parent).c(); 但是问题是,这样就会破坏a的封装,如果我把a放到d窗体里面,又得改代码, 所以我想,可不可以在a的构造函数中传入一些参数,让a知道调用哪些函数,比如将一个函数作为参数传进去,但不知道该怎么实现。既不破坏a的封装,又可以调用父级窗体的特定函数,该如何实现,求高人指点! 展开
2个回答
展开全部
你在自定义控件多写一个构造函数,参数类型是form,保存下来,然后创建这个自定义控件对象的时候把父窗体整个传递进去,然后就可以调用父窗体的public方法了,不过这么做有些浪费资源。
你也可以用楼上说的第2种方法,也挺好
你也可以用楼上说的第2种方法,也挺好
追问
不行啊,如果把构造函数的参数类型声明为form的话,因为主窗体是继承的form类型,可不叫form类,比如说是: public partial class Form1 : Form ,真正定义我需要的方法的是Form1,Form类型是调用不了方法的,除非在控件代码里面进行转换,可是这样一来,又回到原点上了,代码里显式的出现了Form1,破坏了封装,因为如果Form1改个名字的话,代码就用不了了
追答
你可以在FORM1的父类型FORM里添加一个可继承的方法,然后在FORM1里重写这个方法,自己调用自己的函数,自定义控件就都传递FORM,不过这个层次比较复杂,你多用this和parent调试。
其实这个方法跟这个原理差不多
2:在父窗体中添加共有属性,通过修改属性调用你需要的方法,例如:
b
{
public int i
{
get;
set
{
c();//需要的功能
}
}
}
你想在子控件控制父窗体本身就是不理想的方式,转换思路使父窗体检测子窗体控件后作出判断是理想的方法
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询