Динамически сгенерированное свойство 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 сразу после удаления строки