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