Почему asp.net не может найти мой пользовательский WebControl?

У меня есть настраиваемый элемент управления, который будет делать некоторые причудливые вещи, если ему известны взаимосвязи других элементов управления. Вот как я пытался подключить это, я открыт для предложений, если вы знаете способ получше.

Сначала я создал несколько интерфейсов, затем элемент управления для управления отношениями.

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>

Проблема в том, что в свойстве CustomControlId CustomDDL я не могу зарегистрировать контроллер, потому что asp.net сообщает, что не может его найти. FindControl всегда возвращает null. Почему? Я установил идентификатор, и у меня есть атрибут runat, установленный на server. Я даже вижу это в сгенерированном HTML. Любая помощь будет оценена.


person Matthew Rhoden    schedule 13.02.2012    source источник
comment
Пожалуйста, покажите нам место, где вы используете FindControl, а также отца вашего контроля.   -  person Hanlet Escaño    schedule 13.02.2012


Ответы (1)


FindControl не выполняет рекурсивный поиск элементов управления на странице. См. здесь для исправления.

person rie819    schedule 13.02.2012