动态生成的复选框'checked属性显示为false,无论其实际状态如何

时间:2012-07-10 11:17:52

标签: c# asp.net web-controls

我有一个asp:使用页面上的控件填充“产品”的表(“添加”按钮和数量文本框)。 在我的代码后面,每当要添加一个表项时,我首先创建一个Product实例,设置其属性,然后将其添加到产品列表中。然后我用表格执行以下操作: - 清除其Rows系列 - 添加标题行 - 将表绑定到产品列表 - 缓存产品列表,供以后使用

表中的每一行都以包含复选框的单元格开头。在桌子下面是一个“全部清除”LinkBut​​ton。单击Clear All LinkBut​​ton时, 我将它指向一个循环遍历所有CheckBox的方法,确定它们是否被选中,如果checked == true,则删除Product列表中的相应条目。 因此,理论上,当我将Products列表重新绑定到Table时,应该删除选中了CheckBox的行。

如果表中有一行,则此方法有效:调试时,CheckBox的checked属性显示为“true”,并删除该行。但是,如果有多行,则检查属性为 所有CheckBox都显示为“false”,并且没有删除任何内容。

编辑 - 它实际上似乎删除了表的最后一行,尽管其余的CheckBox被视为未被检查。

以下是页面上的表格:

<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 个答案:

答案 0 :(得分:0)

我也认为你的循环看起来很奇怪,并且同意你也应该从i = 1开始。 快速回答是在删除行后立即使用--i

答案 1 :(得分:0)

有人留下了答案,说控件需要对其属性的ID进行正确评估,然后将其删除。无论如何,事实证明这是问题的根源。在创建代码中给出复选框ID之后,它开始以时尚的方式工作。

但是,使用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();                
        }            
    }

感谢那些帮助过的人,感谢幻影回答者!