2012-07-10 48 views
0

我有一個asp:表使用頁面上的控件(「添加」按鈕和文本框的數量)填充「產品」。 在我的代碼背後,無論何時添加一個表項,我首先創建一個Product實例,設置其屬性,然後將其添加到產品列表中。然後我做的表如下: - 清除其行收集 - 添加標題行 - 綁定表產品 名單 - 緩存的產品列表中,供以後使用動態生成的複選框的檢查屬性顯示爲false,無論其實際狀態

的每行表格以包含複選框的單元格開始。在表格下方是「Clear All」LinkBut​​ton。點擊清除所有鏈接按鈕時,我將其引導至一種方法,以在所有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); 
     } 
    } 
+1

那麼,從我的頭頂我沒有看到任何特別的東西。但你如何填充你的'Cache [「TableRows」]'?也許這是你創建代碼中的一個疏忽。另外,在你的'ClearSelectedTableRows'方法中,'TableRow row = new TableRow();'和'CheckBox rowBox = new CheckBox()'是不必要的;只需在for循環中聲明它們即可。編輯:另外,你的for循環看起來很奇怪。你應該從'int i = 1'開始也許;根據您的編輯你「跳過標題行」,但隨後三線向下刪除當前行 – 2012-07-10 11:37:19

+1

,嘗試改變線'tableRows.RemoveAt(I)(這可能是標題行!);''來tableRows.RemoveAt (i + 1);' – 2012-07-10 11:49:43

+0

感謝Chis,我會在創建它們的代碼上做一個大膽的嘗試。關於循環:帶有i + 1的部分正在獲取頁面表格中複選框的值。在「tableRows.RemoveAt(i)」部分,它引用了表將被綁定到的列表,它沒有標題行。 – dbr 2012-07-10 11:58:24

回答

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();     
     }    
    } 

感謝那些誰幫助,並感謝幻影回答者!

0

我也認爲你的循環似乎很奇怪,並同意你也應該從i = 1開始。 一個快速的答案將使用--i刪除行後

+0

感謝您的回答。這可能看起來很奇怪,但它的工作,這對我來說很重要:)無論我在一個地方添加「我」還是從另一個地方減去它,它都會有相同的最終結果 – dbr 2012-07-10 13:48:22