FindControl в ASCX UserControl - PullRequest
       18

FindControl в ASCX UserControl

0 голосов
/ 21 марта 2011

Я пытаюсь найти элемент управления DIV, который я установил для запуска на сервере в моем файле ascx, но когда я отлаживаю его, я получаю значение findcontrol, равное нулю, поэтому его не удается найти, что я делаю неправильно?

Это вызывается с моей страницы ASPX:

        HtmlGenericControl div = (HtmlGenericControl)FindControl("search");
        div.Visible = false;

Мой код ASCX:

<div class="contactsearch" id="search" runat="server" visible='true'>
//mycontent
</div>

Ответы [ 3 ]

1 голос
/ 21 марта 2011

FindControl ищет только первые потомки, он не рекурсивно обращается к дереву управления, используйте что-то вроде этого:

http://stevesmithblog.com/blog/recursive-findcontrol/

или это

http://ra -ajax.org / JQuery-МОГ-селектор-для-WebControls

0 голосов
/ 21 марта 2011

Вы можете выполнять поиск с использованием рекурсивного алгоритма, как описано в ответах Маркуста и Антонио, и в этом случае он будет работать.Однако у него есть несколько проблем.Например, он не будет работать, если на вашей странице есть два экземпляра usercontrol.

Однако большая проблема заключается в том, что вы нарушаете инкапсуляцию, которую обеспечивает usercontrol.Содержащая страница не должна знать, что пользовательский элемент управления содержит, скажем, текстовое поле с именем «txtSearchCriteria» или кнопку с именем «btnSearch».(Или <div> с именем «search».) Содержащая страница должна работать только с usercontrol, используя интерфейс, который usercontrol предоставляет публично.

Я рекомендую вам создать свойство (или набор свойств) впользовательский контроль, позволяющий потребителям взаимодействовать с элементом управления так, как вы этого ожидаете.Например:

Public Boolean SearchControlsVisible
{
    get { return search.Visible; }
    set { search.Visible = value; }
}

Код свойства может получить доступ к поиску <div> без двусмысленности, даже если у вас есть несколько экземпляров usercontrol на странице.Этот подход также дает вам возможность установить эти свойства в разметке ASPX, когда вы размещаете элемент управления на странице:

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    ...etc... />

Это не в вашем вопросе, но вам нужно будет реагировать на происходящие событияв пользовательском контроле, а также.Инструкции по вызову событий из пользовательского элемента управления см. На этой странице: http://msdn.microsoft.com/en-us/library/wkzf914z(v=vs.71).aspx

После того, как вы создали и выставили событие, вы можете прикрепить обработчик к разметке следующим образом:

<my:ContactSearchPanel ID="contactSearch runat="server"
    SearchControlsVisible="false"
    OnSearchClicked="SearchPanel_SearchClicked"
    ...etc... />
0 голосов
/ 21 марта 2011

Сначала убедитесь, что в иерархии дерева управления есть элемент управления searchsearch.Вы можете сделать это, просто изучив свойство Controls элемента управления.Если он есть, вам нужен рекурсивный поиск, чтобы найти его.

Редактировать: Побит Антонио: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...