我有一个 asp:Table,它使用页面上的控件填充了“产品”(一个“添加”按钮和一个用于数量的文本框)。在我后面的代码中,每当要添加表项时,我首先创建一个 Product 实例,设置其属性,然后将其添加到产品列表中。然后我对表格执行以下操作: - 清除其行集合 - 添加标题行 - 将表格绑定到产品列表 - 缓存产品列表,以备后用
表格中的每一行都以一个包含复选框的单元格开头。表格下方是一个“全部清除”链接按钮。当单击 Clear All LinkButton 时,我将其引导到一个方法以循环遍历所有 CheckBox,确定它们是否被选中,如果选中 == true,则删除产品列表中的相应条目。因此,理论上,当我将 Products 列表重新绑定到 Table 时,应删除选中其 CheckBoxes 的行。
如果表中有单个行,则此方法有效:调试时,CheckBox 的选中属性显示为“true”,并且该行被删除。但是,如果多于一行,则所有 CheckBox 的已选中属性显示为“false”,并且不会删除任何内容。
编辑 - 它实际上似乎删除了表格的最后一行,尽管其余的 CheckBoxes 被视为未检查。
这是页面上的表格:
<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);
}
}