保持复选框gridview不在页面中移动

时间:2017-01-30 20:42:46

标签: c# asp.net gridview

所以我创建了一个GridView,我应该保留已经工作的另一个模块的值,但每次我更改页面时,所选的值都已被遗忘。我构建了一些代码,因为我是ASP的新手,我不知道,我不知道我做错了什么。任何帮助将不胜感激。

    protected void gvApplicants_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gvApplicants.PageIndex = e.NewPageIndex;
        LoadData();
        Response.Write(gvApplicants.PageIndex.ToString());
        int d = gvApplicants.PageCount;
        bool[] values = new bool[gvApplicants.PageSize];
        CheckBox chb;
        int count = 0;
        for (int i = 0; i < gvApplicants.Rows.Count; i++)
        {
            chb = (CheckBox)gvApplicants.Rows[i].FindControl("selectedMail");
            if (chb != null)
            {
                values[i] = chb.Checked;
            }
        }
        Session["page" + gvApplicants.PageIndex] = values;
    }

    protected void gvApplicants_PreRender(object sender, EventArgs e)
    {
        if (Session["page" + gvApplicants.PageIndex] != null)
        {
            CheckBox chb;
            bool[] values = (bool[])Session["page" + gvApplicants.PageIndex];
            for (int i = 0; i < gvApplicants.Rows.Count; i++)
            {
                chb = (CheckBox)gvApplicants.Rows[i].FindControl("selectedMail");
                chb.Checked = values[i];
            }
        }
    }

每次索引丢失,我似乎无法保留原始索引。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是GridView附带的内置分页,那么您始终可以使用页面索引。一般来说,从不PageIndexChanging事件中设置PageIndex。 e.NewPageIndex是gvApplicants.PageIndex 在该事件完成后的内容,它可供参考。

我可以推断以下内容吗?

  1. 每一行都有一个复选框,我可以认为它的状态不属于您对LoadData()的调用。
  2. 当您在PageIndexChanging事件中处理保存状态时,每个复选框都禁用了AutoPostBack。
  3. 为了在页面更改之间保持已检查状态,您需要创建一个在viewstate中保存的唯一ID,以正确识别关联的复选框

    所以在PageIndexChanging

    protected void gvApplicants_PageIndexChanging( object sender, GridViewPageEventArgs e )
    {
        GridView gv = (GridView) sender;
    
        foreach( GridViewRow gvr in gv.Rows){
            CheckBox cb = (CheckBox) gvr.FindControl( "selectedMail" );
            String cbid = String.Format( "cb{0}", gv.PageIndex * gv.PageSize + gvr.RowIndex );
    
            ViewState[ cbid ] = cb.Checked;
        }
    }
    

    要恢复:

    protected void gvApplicants_RowDataBound( object sender, GridViewRowEventArgs e )
    {
        if ( e.Row.RowType == DataControlRowType.DataRow )
        {
            GridView gv = (GridView)sender;
            CheckBox cb = (CheckBox) e.Row.FindControl( "selectedMail" );
    
            String cbid = String.Format( "cb{0}", gv.PageIndex * gv.PageSize + e.Row.RowIndex );
    
            cb.Attributes["data-unique-id"] = cbid;
            cb.Checked = ViewState[ cbid ]; 
        }
    }
    

    请记住,这非常简单和混乱,更不用说管理行删除了。但这比用短期状态数据加密会话要好。

    考虑使用从索引属性访问的可持久集合来合并状态数据。 SO上有很多例子。