Динамически сгенерированное свойство checkbox отображается как false независимо от их фактического состояния.

У меня есть asp: Таблица, которая заполняется "продуктами" с помощью элементов управления на странице (кнопка "Добавить" и текстовое поле для количества). В моем коде позади всякий раз, когда нужно добавить элемент таблицы, я сначала создаю экземпляр Product, устанавливаю его свойства, а затем добавляю его в список продуктов. Затем я делаю с таблицей следующее: - очищаем коллекцию строк - добавляем строку заголовка - привязываем таблицу к списку продуктов - кэшируем список продуктов для дальнейшего использования

Каждая строка в таблице начинается с ячейки, содержащей флажок. Под таблицей находится кнопка "Очистить все". При нажатии кнопки "Очистить все" LinkButton я указываю его методу для циклического перебора всех флажков CheckBox, определяю, проверены ли они или нет, и удаляю соответствующую запись в списке продуктов, если флажок == true. Таким образом, теоретически, когда я перепривязываю список продуктов к таблице, строки, в которых были выбраны их флажки, должны быть удалены.

Это работает, если в таблице есть одна строка: при отладке свойство checkBox check показывается как "true", и строка удаляется. Однако, если имеется более одной строки, свойство selected для всех CheckBoxes отображается как "false", и ничего не удаляется.

РЕДАКТИРОВАТЬ - фактически, кажется, удалить последнюю строку таблицы, хотя остальные флажки обрабатываются как не проверенные.

Вот таблица на странице:

<asp:Table ID="tblProducts" runat="server">
<asp:TableHeaderRow ID="tblProductsHead" runat="server" BorderStyle="Solid">
    <asp:TableHeaderCell ID="colCheckBox" runat="server" Text="">
        <asp:CheckBox ID="chkSelectAll" runat="server" Text="" />
    </asp:TableHeaderCell>
    <asp:TableHeaderCell ID="colProduct" runat="server" Text="Product"><asp:TableHeaderCell>
    <asp:TableHeaderCell ID="colValue" runat="server" Text="Value"></asp:TableHeaderCell>
    <asp:TableHeaderCell ID="colQuantity" runat="server" Text="Quantity"></asp:TableHeaderCell>
    <asp:TableHeaderCell ID="colTotalValue" runat="server" Text="Total Value"></asp:TableHeaderCell>
</asp:TableHeaderRow>
</asp:Table>
<asp:LinkButton ID="lbtnClearAll" runat="server" Text="Clear All" 
    onclick="lbtnClearAll_Click"></asp:LinkButton>

... и вот соответствующие разделы кода позади:

 private void ClearSelectedTableRows()
    {
        if (Cache["TableRows"] != null)
        {
            tableRows = Cache["TableRows"] as List<TableRow>;
            Cache.Remove("TableRows");

            TableRow row = new TableRow();
            CheckBox rowBox = new CheckBox();

            for (int i = 0; i < tableRows.Count; i++)
            {
                row = tblProducts.Rows[i+1]; // skip header row
                rowBox = row.Cells[0].Controls[0] as CheckBox;

                if (rowBox.Checked)
                    tableRows.RemoveAt(i);

            }

            TableRow headRow = tblProductsHead;
            tblProducts.Rows.Clear();
            tblProducts.Rows.Add(headRow);
            Cache.Insert("TableRows", tableRows, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
            PopulateTable();                
        }
    }


private void PopulateTable()
    {
        if (Cache["TableRows"] != null)
        {
            List<TableRow> rows = Cache["TableRows"] as List<TableRow>;
            foreach (TableRow row in rows)
                tblProducts.Rows.Add(row);
        }
    }

2 ответа

Решение

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

Однако дальнейшие проблемы были вызваны использованием метода RemoveAt(); Я использовал счетчик списка "tableRows" для длины цикла, в то же время потенциально изменяя длину этого списка внутри цикла.

Это исправлено, и вот обновленный метод:

    private void ClearSelectedTableRows()
    {
        if (Cache["TableRows"] != null)
        {
            tableRows = Cache["TableRows"] as List<TableRow>;
            Cache.Remove("TableRows");

            TableRow row = new TableRow();
            CheckBox rowBox = new CheckBox();
            List<TableRow> rowsToRemove = new List<TableRow>();
            for (int i = 0; i < tableRows.Count; i++)
            {
                row = tblProducts.Rows[i+1]; // skip header row
                rowBox = row.Cells[0].Controls[0] as CheckBox;

                if (rowBox.Checked)
                    rowsToRemove.Add(tableRows[i]);                    
            }

            foreach (TableRow removeRow in rowsToRemove)
            {
                if (tableRows.Contains(removeRow))
                    tableRows.Remove(removeRow);
            }

            TableRow headRow = tblProductsHead;
            tblProducts.Rows.Clear();
            tblProducts.Rows.Add(headRow);
            Cache.Insert("TableRows", tableRows, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
            PopulateTable();                
        }            
    }

Спасибо тем, кто помог, и спасибо фантомному ответчику!

Я также думаю, что ваш цикл кажется странным, и согласен, что вы также должны начать с i=1. Быстрый ответ будет использовать --i сразу после удаления строки

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