Понадобилось тут такая вот простая функциональность: есть какие-то группы checkbox’ов, списки всякие и т.д, коих (групп) на странице может быть несколько. При этом для каждой группы хочется иметь возможность включить/выключить все checkbox’ы разом. На стороне клиента, конечно, прибегать к коду на сервере тут как-то глупо.
Казалось бы – задача типичная и элементарная, однако поиск в интернете практически ничего не дал, за исключением примитивных циклов по всем контролам формы и циклов по элементам, имена которых задаются по шаблону. А вопросов на эту тему достаточно много.
Это показалось странно: я не хочу задавать шаблоны, я хочу всего лишь указать группу checkbox’ов, которые должны включаться и выключаться одновременно. Поэтому пришлось делать свой контрольчик. С учетом того, что опыта работы с JavaScript я, в общем-то, не имею и с ASP.NET AJAX на уровне скриптов почти не работал, на создание контола у меня ушел примерно час.
Выглядит это теперь примерно так:
<asp:CheckBox
runat="server"
ID="_checkAllInFirst"
Text="First Group (click to check all)" />
<patrolAjax:CheckAllCheckBoxesExtender
runat="server"
CheckBoxesContainerID="_firstPanel"
TargetControlID="_checkAllInFirst" />
<asp:Panel runat="server" ID="_firstPanel">
<asp:CheckBox ID="CheckBox2" runat="server" Text="First" />
<asp:CheckBox ID="CheckBox3" runat="server" Text="Second" />
<asp:CheckBox ID="CheckBox4" runat="server" Text="One more..." />
</asp:Panel>
Моему контролу (CheckAllCheckBoxesExtender) нужно просто “показать” контейнер с checkbox’ами (свойство CheckBoxesContainerID) и “шаблонный” checkbox, который будет включать/выключать остальные checkbox’ы.
Вот так вот все оказалось просто.
Кстати, я делал этот контрол на базе AjaxToolkit, и как-то даже понравилось то, до чего дошла “современная” JavaScript, я уж не говорю об ASP.NET Ajax Framework, который позволяет и наследование, и интерфейсы, и другие “вкусности”. Похоже, что JavaScript сильно изменилась за последние годы, с тех пор, как я ее очень не любил ;)
Исходный код контрольчика прилагается. Я не стал пихать в архив AjaxToolkit, поэтому перед тем, как скомпилировать, нужно будет “починить” референс на эту библиотеку (скачать с http://ajax.asp.net, если ее нет).
Тестово-демонстрационный сайт из одной странички прилагается :)
AjaxControls.zip (23.55 kb)