試してみてください (Checkbox_Checked と Checkbox_PreRender の 2 つのイベントをグリッドの CheckBox コントロールに設定する必要があります。また、Checks 配列へのインデックスが存在するように、DataKey をグリッドに設定する必要があります。)
protected bool[] Checks
{
get { return (bool[])(ViewState["Checks"] ?? new bool[totalLengthOfDataSource]); }
set { ViewState["Checks"] = value; }
}
protected void Checkbox_Checked(object sender, EventArgs e)
{
CheckBox cb = (CheckBox)sender;
bool[] checks = Checks;
checks[(int)GetRowDataKeyValue(sender)] = cb.Checked;
Checks = checks;
}
protected void Checkbox_PreRender(object sender, EventArgs e)
{
CheckBox cb = (CheckBox)sender;
bool[] checks = Checks;
cb.Checked = checks[(int)GetRowDataKeyValue(sender)];
}
これらは、静的 GridViewUtils クラスで最適に機能します。
public static GridViewRow GetRow(object sender)
{
Control c = (Control)sender;
while ((null != c) && !(c is GridViewRow))
c = c.NamingContainer;
return (GridViewRow)c;
}
/// <summary>
/// Get the Grid the row is in
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public static GridView GetGrid(this GridViewRow row)
{
Control c = (Control)row;
while ((null != c) && !(c is GridView))
c = c.NamingContainer;
return (GridView)c;
}
/// <summary>
/// Get the ID field value based on DataKey and row's index
/// </summary>
/// <param name="sender">Any web-control object in the grid view</param>
/// <returns></returns>
public static object GetRowDataKeyValue(object sender)
{
try
{
GridViewRow row = GetRow(sender);
GridView grid = row.GetGrid();
return grid.DataKeys[row.RowIndex].Value;
}
catch
{
return null;
}
}