За ваш комментарий к ответу Ника я вижу, что вы предпочитаете делать это на стороне сервера.Мое предупреждение здесь заключается в том, что для этого вам необходимо установить для свойства AutoPostBack CheckBox значение True, что означает, что каждый раз, когда пользователь проверяет или снимает флажок, возникает обратная передача.Это может привести к неоптимальному взаимодействию с пользователем.
Решение на стороне сервера
Не обращая на это внимания, вот как вы это сделаете на стороне сервера.Во-первых, я полагаю, у вас есть TemplateField в вашем GridView, который содержит CheckBox?Вам необходимо установить для его свойства AutoPostBack
значение True и создать для него обработчик событий CheckChanged
.(Вы можете создать обработчик событий, перейдя в Designer и выбрав Edit Templates из смарт-тега GridView. Затем выберите Template и дважды щелкните CheckBox.)
Вот моя разметка GridView для этого примера.Обратите внимание на конфигурацию CheckBox - здесь AutoPostBack
имеет значение True, а серверное событие OnCheckChanged
подключено к обработчику событий на стороне сервера, chkSelected_CheckChanged
:
<asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="dsProducts">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="chkSelected" AutoPostBack="true"
oncheckedchanged="chkSelected_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
...
</Columns>
</asp:GridView>
chkSelected_CheckedChanged
обработчик событий моего класса code-behind, проходит по строкам GridView.Для каждой строки я ссылаюсь на CheckBox (chkSelected
) и проверяю, проверен ли он.Если это , а не , тогда я могу отключить свою кнопку (btnDoSomething
).Если я перебираю все строки GridView, и ни одна из них не проверена на , а не , я знаю, что мне нужно включить мою кнопку.
protected void chkSelected_CheckedChanged(object sender, EventArgs e)
{
// Iterate through all of the rows in the grid and see if there is any unchecked CheckBox
foreach (GridViewRow row in gvProducts.Rows)
{
var cb = row.FindControl("chkSelected") as CheckBox;
if (!cb.Checked)
{
btnDoSomething.Enabled = false;
return;
}
}
// If we reach here, all checkboxes are checked, so enable btnDoSomething
btnDoSomething.Enabled = true;
}
Решение на стороне клиента
Решение на стороне сервера довольно простое, но имеет недостаток, заключающийся в необходимости обратной передачи при каждой проверке / снятии флажка CheckBox.Я настоятельно рекомендую использовать подход на стороне клиента.На самом деле довольно просто использовать библиотеку JavaScript, такую как jQuery .
Здесь разметка GridView такая же, как и раньше, за исключением того, что CheckBox не вызывает обратную передачу (то есть, AutoPostBack
является False) и нет обработчика событий на стороне сервера:
<asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="dsProducts">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="chkSelected" />
</ItemTemplate>
</asp:TemplateField>
...
</Columns>
</asp:GridView>
Вся магия происходит на стороне клиента.Предполагая, что вы ссылаетесь на библиотеку jQuery, ваш код JavaScript будет выглядеть следующим образом:
<script type="text/javascript">
$(document).ready(function () {
$("#<%=gvProducts.ClientID%> input[id*='chkSelected']:checkbox").click(EnableDisableButtonAsNeeded);
EnableDisableButtonAsNeeded();
});
function EnableDisableButtonAsNeeded() {
var totalCheckboxes = $("#<%=gvProducts.ClientID%> input[id*='chkSelected']:checkbox").size();
var checkedCheckboxes = $("#<%=gvProducts.ClientID%> input[id*='chkSelected']:checkbox:checked").size();
if (totalCheckboxes == checkedCheckboxes)
$("#<%=btnDoSomething.ClientID %>").removeAttr('disabled');
else
$("#<%=btnDoSomething.ClientID %>").attr('disabled', 'disabled');
}
</script>
Я создал функцию на стороне клиента с именем EnableDisableButtonAsNeeded
, которая определяет, сколько всего флажков в сетке и какмногие проверены.Если эти два числа равны, то он активировал кнопку, иначе он ее отключил.Эта функция вызывается один раз, когда страница загружается, а также каждый раз, когда флажок установлен или снят.
Счастливого программирования!