Пользовательский контейнер имен для ASP.NET GridView?

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам