500 以上のレコードを持つグリッドがあります。最初のページで、アイテムをランダムに選択して編集をクリックすると機能しますが、任意のページにページングした後、例外が発生します
> Index was out of range. Must be non-negative and less than the size of
> the collection. Parameter name: index
クロスチェックしました: Viewstate が有効で、グリッドが適切にバインドされています。
以下は私のコードです:
/// <summary>
/// Returns a comman separated value of the id selected in the grid.
/// </summary>
/// <param name="gv"></param>
/// <param name="checkbox"></param>
/// <returns></returns>
public static string GetGridViewsSelectedRowValues(GridView gv, string checkbox)
{
var sb = new StringBuilder();
if(gv.Rows.Count>0)
{
foreach (GridViewRow row in gv.Rows)
{
var cbx = (CheckBox) row.FindControl(checkbox);
if(cbx!=null && cbx.Checked)
{
var dataKey = gv.DataKeys[row.RowIndex];
if (dataKey != null) sb.Append(string.Format("{0},", dataKey.Value));
}
}
}
return sb.ToString().Remove(sb.ToString().LastIndexOf(','));
}
私の編集ボタンクリックイベント:
protected void btnEdit_Click(object sender, EventArgs e)
{
int count = Common.GridSelectedRows(gvCityMaster, "chkBxSelect");
if (count > 1)
{
Common.ShowMessage("Only one item can be edited at once.");
}
else
{
int id = Common.ParseInt(Common.GetGridViewsSelectedRowValues(gvCityMaster, "chkBxSelect"));
if (id > 0)
{
DisplayForm();
DisplayUserDetails(id);
}
}
}
DataKeys コレクションも調べました。コレクションごとに 18 個ありますが、これで問題ありません。