我有一個asp:表使用頁面上的控件(「添加」按鈕和文本框的數量)填充「產品」。 在我的代碼背後,無論何時添加一個表項,我首先創建一個Product實例,設置其屬性,然後將其添加到產品列表中。然後我做的表如下: - 清除其行收集 - 添加標題行 - 綁定表產品 名單 - 緩存的產品列表中,供以後使用動態生成的複選框的檢查屬性顯示爲false,無論其實際狀態
的每行表格以包含複選框的單元格開始。在表格下方是「Clear All」LinkButton。點擊清除所有鏈接按鈕時,我將其引導至一種方法,以在所有CheckBox中循環,確定是否檢查它們,並且如果選中== true,則刪除產品列表中的相應條目。 因此,從理論上講,當我將產品列表重新綁定到表格時,應該刪除選中它們的CheckBox的行。
如果表中有單個行,則可以使用:調試時,CheckBox的checked屬性顯示爲「true」,並且該行被刪除。但是,如果有多行, 的選中屬性將顯示爲「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);
}
}
那麼,從我的頭頂我沒有看到任何特別的東西。但你如何填充你的'Cache [「TableRows」]'?也許這是你創建代碼中的一個疏忽。另外,在你的'ClearSelectedTableRows'方法中,'TableRow row = new TableRow();'和'CheckBox rowBox = new CheckBox()'是不必要的;只需在for循環中聲明它們即可。編輯:另外,你的for循環看起來很奇怪。你應該從'int i = 1'開始也許;根據您的編輯你「跳過標題行」,但隨後三線向下刪除當前行 – 2012-07-10 11:37:19
,嘗試改變線'tableRows.RemoveAt(I)(這可能是標題行!);''來tableRows.RemoveAt (i + 1);' – 2012-07-10 11:49:43
感謝Chis,我會在創建它們的代碼上做一個大膽的嘗試。關於循環:帶有i + 1的部分正在獲取頁面表格中複選框的值。在「tableRows.RemoveAt(i)」部分,它引用了表將被綁定到的列表,它沒有標題行。 – dbr 2012-07-10 11:58:24