我有一个在ParentUserControl中加载的ChildUserControl。主页加载ParentUserControl。
我需要从ChildUserControl访问ParentUserControl中的属性。
感谢您的时间
答案 0 :(得分:10)
平台/语言等不清楚,所以这个答案必然含糊不清......但是,一般来说,子控件无法从父(直接)访问属性,因为很多不同类型的父控件都可以托管儿童控制。儿童不应该硬编码为单亲,否则也可能是父母的部分。
通常,您可能想要尝试简单地删除要求 - 这听起来像一个奇怪的设计。但是,某些框架支持之类的 - 例如,WPF中的依赖项属性。
基于接口的设计(对于父代)是一种方法,但这不是很干净。对于.NET,事件等是孩子与父母交流的另一种常见方式 - 孩子暴露不同父母可以不同方式消费的事件。
除此之外,您进入测试/转换父级(针对类或接口)的区域以访问父级的详细信息 - 例如:
ParentControlType parent = this.Parent as ParentControlType;
if(parent != null) {
// access properties etc of "parent"
}
(也可以在这里使用界面;无论如何还是有点hacky ......)
就个人而言,我宁愿父母控制,也不愿使用这种类型的儿童演员。父对子设置属性,并侦听事件(而不是父对象的子集属性):
// in the parent
child.SomeProperty = 132;
child.SomePropertyChangd += delegate {
// do something at the parent
};
这样,孩子不知道或不关心父母。它只知道它有属性(等),并可以通知其他人有趣的变化。
答案 1 :(得分:1)
可以通过((ParentType)Me.Parent)从子控件访问父级。不建议这样做。无法知道控件不会在另一个页面/控件上使用。编译器不会捕获这个,这个转换会在运行时导致异常。
处理此问题的最佳方法是让父级提供子控件所需的任何信息(在控件上创建公共属性或方法)。这甚至可能意味着父控件为子控件提供了一个强类型的引用(可能通过接口)。这样编译器可以确保您不会遇到子控件假定父类型错误的情况。
答案 2 :(得分:0)
很抱歉不清楚。该平台是.NET,语言是C#。
我有一个托管多个子控件的父母。这是在C#中实现可视继承的一种方式,因为在子代之间共享了许多UI控件。
通过界面设计,您是否建议父和子(ren)实现通用接口?
答案 3 :(得分:0)
您可以像这样使用反射:
public static T GetData<T>(this Control c, string propertyName, T defaultValue){
Type t = obj.GetType();
var prop = t.GetProperties().FirstOrDefault(p => p.Name == propertyName);
if(prop == null) return defaultValue;
else {
object val = prop.GetValue(obj, null);
if(val == null) return defaultValue;
else return (T)val;
}
}
这个简单的扩展方法扩展了“控制”但你可以很容易地把它放在任何东西上(当我在传递匿名类时,我已经在object
上使用它,这本身就是一个坏主意!)< / p>
然后使用:
string someData = this.Parent.GetData("someProperty", string.Empty);
答案 4 :(得分:0)
您可以使用子控件的this.Parent
属性,但如果您正在寻找更合适的OO解决方案,则不会。允许孩子知道关于父母的任何事情最终会以某种方式绑定他们并限制重复使用。在大多数情况下,这只是理论上的兴趣,如果你正在敲打一些快速的一次性网站,你可以根据需要违反它。但更合适的方法是使用基于事件的通信。
答案 5 :(得分:0)
感谢您的回复。
我会考虑反思。但是,我听说它有性能瓶颈。
吉姆 - 你说:~~
处理此问题的最佳方法是让父级提供子控件所需的任何信息(在控件上创建公共属性或方法)。这甚至可能意味着父控件为子控件提供了一个强类型的引用(可能通过接口)。这样编译器可以确保您不会遇到子控件假定父类型错误的情况。
~~
在我的情况下,父和子(ren)都实现了相同的接口。这是不好的设计吗?如果我在接口中添加父引用的属性,那么考虑到父实现相同的接口,它会工作吗?
答案 6 :(得分:0)
如果您有2个嵌套用户控件(UC):
UC1.ascx
| - UC2.ascx
在UC1.ascx中,您可以定义一个满足您需要的公共功能或属性:
fnUC1(PARAM)
在UC2.ascx中,你可以通过以下代码获得此功能:
CTYPE(Parent.Parent,UC1).fnUC1(PARAM)
如果您的UC2控件位于另一个容器(如转发器)中,您还必须从此容器中退出,因此代码将为:
CTYPE(Parent.Parent.Parent,UC1).fnUC1(PARAM)
我承认它不是“艺术状态”......但它适用于始终协同工作的嵌套控件,如父(UC1)/子(UC2)数据显示。
希望这会有所帮助。
皮尔。