2

承認する列を含む 4 列のグリッドビューがあります。承認には、バインド後にデータセットのすべての行に対して繰り返されるチェックボックスがあります。allowpaging = true & pageindexsize を 10 にしました。ここで、2 行目と 5 行目のチェックボックスをオンにして、2 ページ目に移動し、1 ページ目に戻ったとします。(2 行目と 5 行目) チェックしたチェックボックスページ 1 が未チェックの状態にリセットされています。その理由は、onpageindexching イベントで行う gridview のバインドが原因であることがわかっています。しかし、あるページから別のページに移動しても、チェックボックスの状態を維持する方法はありますか?

ありがとう

4

4 に答える 4

1

Session を使用して値を維持できます。1 つのページ インデックス変更イベントでは、セッションに値を追加してチェックボックスを再バインドする必要があります。

ここにあなたを助けるかもしれないいくつかのリンクがあります

  1. http://forums.asp.net/p/1368550/2852029.aspx
  2. http://myaspsnippets.blogspot.com/2010/08/maintaining-state-of-checkboxes-while.html
于 2011-06-28T04:50:10.857 に答える
1

試してみてください (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;
    }
}
于 2011-06-28T07:17:53.767 に答える
0

別のアプローチ:

「userSelected」(または同様のもの) と呼ばれるバインド可能なオブジェクトに bool プロパティを作成します バインド可能なリスト オブジェクトにオブジェクト ID でインデクサーを作成します grid_RowDataBound では、バインド可能なオブジェクトの ID を属性としてチェックボックスに追加します grid_RowDataBound では、チェックボックスの checked プロパティも obj に設定します.userSelected chech_CheckChaged では、インデクサーを使用して、バインド可能なオブジェクトの userSelected プロパティを設定します

ありがとう

于 2013-11-13T14:16:51.297 に答える