Пользовательский контейнер имен для ASP.NET GridView? - PullRequest
1 голос
/ 27 августа 2009

Я ищу информацию о том, как реализовать пользовательский контейнер именования для элементов в GridView. Моя проблема в том, что у меня есть GridView с ячейкой для каждого дня недели, и каждая ячейка будет содержать одинаковые или похожие элементы управления. Для одинаковых элементов управления было бы неплохо назвать их одинаково, например, "lblPersonName".

Однако, если вы это сделаете, вы не сможете использовать FindControl (), потому что он будет жаловаться, что в строке есть элементы управления с дублирующимися идентификаторами. Корень проблемы заключается в том, что контейнер именования для элементов управления в GridView - это не ячейка таблицы (DataControlFieldCell или что-либо еще), а GridViewRow.

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

Конечно, ASPX для этого начинает становиться немного большим - я начинаю сожалеть, что я запустил проект в ASP.NET MVC ....

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

Для уточнения: - Каждый столбец определяется с помощью ItemTemplate, а элементы управления находятся в ItemTemplate. - Единственный способ заставить его работать прямо сейчас - это иметь "lblPersonNameOne", "lblPersonNameTwo" и т. Д.

Ответы [ 2 ]

1 голос
/ 27 августа 2009

На самом деле, кажется, что это может быть довольно легко ... Сейчас я экспериментирую с тем, что создал серверный элемент управления клиента, который наследуется от asp: Panel, но он реализует INamingContainer. При реализации этого он автоматически вставляет идентификатор элемента управления в поток уникальных идентификаторов дочерних элементов управления.

Итак, вы можете добавить элементы управления из каждого шаблона с одинаковыми идентификаторами (динамически или декларативно), и они получат свои собственные идентификаторы. Тогда вам просто нужно использовать FindControl в самой ячейке, а не в строке, и он найдет элемент управления с искомым идентификатором + надстройкой уникального идентификатора.

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

0 голосов
/ 27 августа 2009

Что если вы сделали каждый столбец TemplateField и объявили элементы управления в шаблоне. Таким образом, каждый элемент управления должен иметь уникальный идентификатор.

...