为什么asp.net找不到我的自定义WebControl?

时间:2012-02-13 15:07:36

标签: asp.net null custom-controls registration web-controls

我有一个自定义控件,一旦知道其他控件的关系就会做一些奇特的东西。这就是我试图连接这些东西的方法,如果你知道更好的方法,我愿意接受建议。

首先我创建了一些接口,然后是控制来管理关系。

public interface IRegisterSelf
{
    string ParentId { get; set; }
    string CustomControlId { get; set; }
    void RegisterToControl(ICustomControl controller);
}

public interface ICustomControl
{
    void Register(IRegisterSelf child, IRegisterSelf parent);
}

public class CustomControl : WebControl, ICustomControl
{
    public List<KeyValuePair<IRegisterSelf, IRegisterSelf>> _relationShips 
        = new List<KeyValuePair<IRegisterSelf, IRegisterSelf>>();

    public void Register(IRegisterSelf child, IRegisterSelf parent)
    {
        _relationShips.Add(new KeyValuePair<IRegisterSelf, IRegisterSelf>(parent, child));
    }
}

之后,我创建了另一个遵循IRegisterSelf接口的自定义控件:

public class CustomDDL : DropDownList, IRegisterSelf
{
    public string ParentId { get; set; }

    private ICustomControl _customControl;

    public string CustomControlId
    {
        get
        {
            return ((Control)_customControl).ID;
        }
        set
        {
            _customControl = (ICustomControl)this.FindControl(value);
            RegisterToControl(_customControl);
        }
    }

    public void RegisterToControl(ICustomControl controller)
    {
        if (string.IsNullOrEmpty(ParentId))
            controller.Register(this, null);
        else
            controller.Register(this, (IRegisterSelf)FindControl(ParentId));
    }
}

然后标记来定义所有这些关系:

<c:CustomControl ID="myControl" runat="server" />

<c:CustomDDL ID="box1" CustomControlId="myControl" runat="server">
    <asp:ListItem Text="_value1" Value="Value 1" />
    <asp:ListItem Text="_value2" Value="Value 2" />
    <asp:ListItem Text="_value3" Value="Value 3" />
</c:CustomDDL>

<c:CustomDDL ID="box2" ParentId="box1" CustomControlId="myControl" runat="server">
    <asp:ListItem Text="_value1" Value="Value 1" />
    <asp:ListItem Text="_value2" Value="Value 2" />
    <asp:ListItem Text="_value3" Value="Value 3" />
</c:CustomDDL>

问题是,在CustomDDL的CustomControlId属性中,我无法注册控制器,因为asp.net说无法找到它。 FindControl始终返回null。为什么?我设置了ID,我将runat属性设置为server。我甚至可以在生成的HTML中看到它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

FindControl不会递归查找页面上的控件。有关修复的信息,请参阅here