我有几个来自BaseCtrl
的用户控件。
BaseCtrl
没有.ascx
标记页,但只有.cs
文件中的代码定义。
我确信明确派生自BaseCtrl
的所有控件都在其ChildControl
标记页中定义了CC
个ID为.ascx
的实例。
我需要从CC
代码中检索派生控件中存在的BaseCtrl
实例。
Derived1.ascx
...
<uc1:ChildControl runat="server" ID="CC" />
...
Derived1.ascx.cs
public class Derived1 : BaseCtrl { ... }
Derived2.ascx
...
<uc1:ChildControl runat="server" ID="CC" />
...
Derived2.ascx.cs
public class Derived2 : BaseCtrl { ... }
BaseCtrl.cs
public class BaseCtrl : UserControl
{
protected ChildControl DerivedCC
{
get { /* ??? */ }
};
}
如何在DerivedCC
的{{1}}属性中获取派生类的子控件实例?
是否可以在页面生命周期的任何时间获取它,或者派生的控件是否需要完全加载/初始化?
答案 0 :(得分:4)
选项1:使用FindControl方法按ID查找CC
子控件:
public class BaseCtrl : UserControl
{
protected ChildControl DerivedCC
{
get { return (ChildControl)this.FindControl("CC"); }
}
}
选项2:将名为CC
的受保护字段添加到BaseCtrl
,并从每个派生用户的设计器文件中删除自动生成的CC
字段控制:
public class BaseCtrl : UserControl
{
protected ChildControl CC;
protected ChildControl DerivedCC
{
get { return this.CC; }
}
}
(当然,您可能希望完全删除DerivedCC
属性,因为它是多余的。)
选项3:在DerivedCC
中设置BaseCtrl
一个抽象属性,并在每个派生用户控件中覆盖它:
public abstract class BaseCtrl : UserControl
{
protected abstract ChildControl DerivedCC { get; }
}
public class Derived1 : BaseCtrl
{
protected override ChildControl DerivedCC
{
get { return this.CC; }
}
}
// And similarly for Derived2.
所有这三个选项都允许您在页面生命周期的任何时间点访问DerivedCC
,除了控件&#39;构造函数(此时属性将返回null)。
选项1的优势在于它需要的代码更改量与您当前的代码相比最少。
选项2的优势在于它比调用FindControl更简单,更清晰。
选项3的优势在于它有助于验证在编译时您在每个派生用户控件中实际拥有CC
子控件。