Как проверить, все ли флажки установлены или нет в сетевом представлении ASP.NET - PullRequest
0 голосов
/ 03 декабря 2010

Как узнать, установлены ли все флажки в виде сетки ASP.NET или нет?

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

Как мне это сделать и на каком событии я должен разместить свой код?

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

За ваш комментарий к ответу Ника я вижу, что вы предпочитаете делать это на стороне сервера.Мое предупреждение здесь заключается в том, что для этого вам необходимо установить для свойства 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, которая определяет, сколько всего флажков в сетке и какмногие проверены.Если эти два числа равны, то он активировал кнопку, иначе он ее отключил.Эта функция вызывается один раз, когда страница загружается, а также каждый раз, когда флажок установлен или снят.

Счастливого программирования!

1 голос
/ 03 декабря 2010

Используйте JavaScript. Я предлагаю вам прочитать www.w3schools.com, в частности Флажок отмечен Свойство .

Главное, что вы хотите сделать, это получить "id" всех ваших флажков и циклически их проходить.

0 голосов
/ 04 декабря 2010

Трудно сказать вам точно, куда поместить код, не зная больше о вашей странице и как флажки (не) проверяются, но общий шаблон для этой проверки будет примерно таким:

protected void checkCheckBoxes()
{
    bool allCheckBoxesChecked = true;

    // Go through each row in the gridview
    foreach (GridViewRow row in Gridview1.Rows)
    {
        // Go through every control in the row
        foreach (Control control in row.Controls)
        {
            // Control is the superclass so we can't tell what type it is 
            // Best we can do is examine the control ID...
            if (control.ID.Contains("CheckBox"))
            {
                // Cast the control to a CheckBox so we can examine the Checked property
                if (((CheckBox)control).Checked == false)
                {
                    // If the CheckBox isn't checked, we set our flag
                    allCheckBoxesChecked = false;

                    // Would be nice here to be able to break out of both loops but there's no doublebreak statement in C# :-(
                }
            }
        }
    }

    // Enable the button based on the value of the flag
    Button1.Enabled = allCheckBoxesChecked;

}

Это похоже на ответ Скотта Митчелла, но будет работать с несколькими флажками в строке.

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