0

ページ上のコントロール (「追加」ボタンと数量のテキストボックス) を使用して「製品」が取り込まれた asp:Table があります。私のコード ビハインドでは、テーブル アイテムが追加されるたびに、最初に Product のインスタンスを作成し、そのプロパティを設定してから、製品のリストに追加します。次に、テーブルで次の操作を行います。 - Rows コレクションをクリアする - ヘッダー行を追加する - テーブルを製品のリストにバインドする - 製品のリストをキャッシュして、後で使用できるようにする

テーブルの各行は、チェックボックスを含むセルで始まります。テーブルの下には、「すべてクリア」LinkBut​​ton があります。Clear All LinkBut​​ton がクリックされると、すべての CheckBoxes を循環し、それらがチェックされているかどうかを判断し、checked == true の場合は Product リスト内の対応するエントリを削除するメソッドにそれを指示します。したがって、理論的には、製品リストをテーブルに再バインドすると、チェックボックスが選択されている行を削除する必要があります。

これは、テーブルに単一の行がある場合に機能します。デバッグ時に、CheckBox の checked プロパティが「true」と表示され、行が削除されます。ただし、複数の行がある場合、すべての CheckBoxes の checked プロパティは "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);
        }
    }
4

2 に答える 2

0

また、あなたのループは奇妙に見えると思います。また、i=1から始める必要があることに同意します。簡単な答えは、行を削除した直後に--iを使用することです。

于 2012-07-10T13:20:27.963 に答える
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();                
        }            
    }

助けてくれた方々、ファントムアンサーに感謝!

于 2012-07-10T13:44:29.507 に答える