好像很普遍的问题
在gridview中有一模板列,里面是checkbox。比如我在第一页选中了某些结果,然后翻页到后面,再回来的时候选中的结果没有了。我用session保存了选中状态这样是可以的,可我觉得不好。大家有没有用过其他方法的。多谢!

解决方案 »

  1.   

    如果你的分页是gridview上自带的可以用ViewState来存选中项集合和页码.
    如果是你自己搞的分页不是postback的那种session是最方便的吧
      

  2.   

    see~ http://www.cnblogs.com/jiangshaofen/archive/2008/10/08/782450.html
      

  3.   


    public partial class GridSamples_GridView_CheckBoxColumn : System.Web.UI.Page
    {
        /**//**//**//// <summary>
        /// 获取或设置选中项的集合
        /// </summary>
        protected ArrayList SelectedItems
        {
            get
            {
                return (ViewState["mySelectedItems"] != null) ? (ArrayList)ViewState["mySelectedItems"] : null;
            }
            set
            {
                ViewState["mySelectedItems"] = value;
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            
        }
        protected void GridView1_DataBinding(object sender, EventArgs e)
        {
            //在每一次重新绑定之前,需要调用CollectSelected方法从当前页收集选中项的情况
            CollectSelected();
        }   
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //这里的处理是为了回显之前选中的情况
            if (e.Row.RowIndex > -1 && this.SelectedItems!=null)
            {
                DataRowView row = e.Row.DataItem as DataRowView;
                CheckBox cb = e.Row.FindControl("CheckBox1") as CheckBox;
                if(this.SelectedItems.Contains(row["id"].ToString()))
                    cb.Checked = true;
                else
                    cb.Checked = false;
            }
        }
        /**//**//**//// <summary>
        /// 从当前页收集选中项的情况
        /// </summary>
        protected void CollectSelected()
        {
            ArrayList selectedItems = null;
            if (this.SelectedItems == null)
                selectedItems = new ArrayList();
            else
                selectedItems = this.SelectedItems;        for (int i = 0; i < this.GridView1.Rows.Count; i++)
            {
                string id = this.GridView1.Rows[i].Cells[1].Text;
                CheckBox cb = this.GridView1.Rows[i].FindControl("CheckBox1") as CheckBox;
                if (selectedItems.Contains(id) && !cb.Checked)
                    selectedItems.Remove(id);
                if (!selectedItems.Contains(id) && cb.Checked)
                    selectedItems.Add(id);
            }
            this.SelectedItems = selectedItems;
        }    protected void Button1_Click(object sender, EventArgs e)
        {
            //最后,需要对选中项进行操作之前,不能忘了还要最后一次收集当前页的选中情况
            CollectSelected();       this.TextBox1.Text = string.Empty;
            foreach (object tmp in this.SelectedItems)
                this.TextBox1.Text += tmp.ToString() + ",";
        }
    }
      

  4.   

    楼主的问题是:除了保存前一页的选择外,还有其他更好的办法吗!!
    =================================================
    好像别无他法!!楼主的办法就是大家通常用的办法,
    只不过保存的办法可能不同,有的是Session,有的是ViewState,或者Cookies!!