ASP.NET UserControl继承 - 从base获取派生类控件

时间:2015-03-19 15:07:42

标签: c# asp.net inheritance webforms user-controls

我有几个来自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}}属性中获取派生类的子控件实例?

是否可以在页面生命周期的任何时间获取它,或者派生的控件是否需要完全加载/初始化?

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子控件。