私が行ったことの1つは、セッションでAJAXを介してチェックの状態を記録し、ポストバック(AJAXを介して完全または部分的)で、選択したアクションを実行する項目をセッションで探します。
基本的な考え方は、関連するアイテムのIDを知っているチェックボックスにonclickハンドラーを追加することです。オンクリックハンドラーで、このIDをAJAXを介してサーバーに通信し、セッションに記録します。項目のチェックを外すことができるように、チェックボックスのステータスも通信する必要があります。送信コントロールのハンドラーに、セッションから選択されたアイテムに関するデータを使用させます。
この方法では、チェックされた項目を含むページを(完全または部分的に)レンダリングするときにセッションからチェックボックスの初期値を設定できるため、ページングされたデータも処理できます。
こんな感じかもしれません。PageMethods(そしてもちろんScriptManager)を使用したASP.NETAJAXを想定しています。
<script type='text/javascript'>
function record(checkbox,item)
{
var context = { ctl : checkbox };
PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
}
function onSuccess(result,context)
{
// do something, maybe highlight the row, maybe nothing
}
function onFailure(error,context)
{
context.ctl.checked = false;
alert(error.get_Message());
}
</script>
...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...
Codebehind
[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
List<string> itemList = (List<string>)Session["Items"];
if (itemList == null)
{
itemList = new List<string>();
Session["Items"] = itemList;
}
if (itemList.Contains(itemName) && !value)
{
itemList.Remove(itemName);
}
else if (!itemList.Contains(itemName) && value)
{
itemList.Add(itemName);
}
}
protected void button_OnClick( object sender, EventArgs e )
{
List<string> itemList = (List<string>)Session["Items"];
if (itemList != null)
{
foreach (string item in itemList)
{
// do something with the selected item
}
}
}