DataGrid 分頁時預設不保留跨頁勾選。解法:**客戶端 HiddenField 累積選中鍵值 → 伺服器端 DataBind 時讀取 HiddenField 並回填 CheckBox.Checked**。本文提供完整 ASPX + CodeBehind 範例。
<input type="hidden" id="HdnSelectedValues" runat="server" /> 存儲逗號分隔鍵值 (如 ,Title1,Title2)。onclick 呼叫 JS 函數增刪 HiddenField 值。ItemDataBound 事件中檢查當前行鍵值是否在 HiddenField 中,若是設定 Checked = true。<script>
function AddRemoveValues(chk) {
var hdn = document.getElementById('<%= HdnSelectedValues.ClientID %>');
if (chk.checked) hdn.value += ',' + chk.value;
else hdn.value = hdn.value.replace(',' + chk.value, '');
}
</script>
<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False" AllowPaging="True" OnItemDataBound="DataGrid1_ItemDataBound">
<Columns>
<asp:TemplateColumn HeaderText="選擇">
<ItemTemplate>
<input type="checkbox" runat="server" id="chkSelect" onclick="AddRemoveValues(this)"
value='<%# Eval("Title") %>' />
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Title" HeaderText="文章標題" />
<asp:BoundColumn DataField="CreateDate" HeaderText="發布時間" />
</Columns>
</asp:DataGrid>
<asp:Button ID="Button1" runat="server" Text="取得選中值" OnClick="Button1_Click" />
<asp:Label ID="Label1" runat="server" />
<input type="hidden" id="HdnSelectedValues" runat="server" />
private void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
string title = ((Literal)e.Item.FindControl("TitleShow")).Text; // 或 DataBinder.Eval
if (HdnSelectedValues.Value.IndexOf("," + title) >= 0)
{
((HtmlInputCheckBox)e.Item.FindControl("chkSelect")).Checked = true;
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
// 解析 HiddenField 值
var selected = HdnSelectedValues.Value.TrimStart(',').Split(',');
Label1.Text = string.Join("
", selected);
}
Set 或陣列管理,避免字串替換效能與邊界問題。