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的封装,又可以调用父级窗体的特定函数,该如何实现,求高人指点!
展开
 我来答
光荣传奇3851
2011-10-25
知道答主
回答量:20
采纳率:0%
帮助的人:26.9万
展开全部
这个牵涉的问题很多,传方法是不肯能的,因为方法都需要通过类的实例来调用(当然除了静态方法外),所以你有两个方向的办法
1:传入父窗体的一个引用到a中,这样你可以调用父窗体的所有Public的函数
2:在父窗体中添加共有属性,通过修改属性调用你需要的方法,例如:
b
{
public int i
{
get;
set
{
c();
}
}
}

这样只要你对i赋值一次就会调用一次c();
如果存在参数可以通过修改i的类型窗体参数给c()调用
你咋还不囧
推荐于2016-03-04 · TA获得超过434个赞
知道答主
回答量:50
采纳率:0%
帮助的人:67.3万
展开全部
你在自定义控件多写一个构造函数,参数类型是form,保存下来,然后创建这个自定义控件对象的时候把父窗体整个传递进去,然后就可以调用父窗体的public方法了,不过这么做有些浪费资源。
你也可以用楼上说的第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();//需要的功能
}
}
}
你想在子控件控制父窗体本身就是不理想的方式,转换思路使父窗体检测子窗体控件后作出判断是理想的方法
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式