如何使用viewstate 实现gridview 翻页,CheckBox保存选中状态!!
哪位大侠帮忙解决一下,或给个思路!!谢谢。

解决方案 »

  1.   

    你都说了用viewstate了,还要什么思路?
      

  2.   

    1个三角,说多了也没用。 套个updatePanl版子,将就到用。
    事下把 页面生命周期和控件原理 学懂,界面层就没有做不到的了
      

  3.   

    主要功能:
    1.实现GridView的分页功能.
    2.实现GridView分页时候记录下checkBox的状态

      主要代码:
    下面代码显示了GridView的使用
    <asp:GridView ID="GridView1" runat="server"
    AutoGenerateColumns="False" AllowPaging="True" 
    PageSize="5" Width="324px" DataKeyNames="CategoryID"
    OnPageIndexChanging="GridView1_PageIndexChanging">
    <Columns>
    <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" />
    <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" />
    <asp:TemplateField HeaderText="Select">
    <ItemTemplate>
    <asp:CheckBox ID="CheckBox1" runat="server" />
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>
     
    请注意这里AllowPaging设置为true,表示启用了分页,而且分页大小为5。DataKeyNames设置为CategoryID,因为他是数据库使用的主键。使用后台代码,首先定义一个常量
     
    /* QUERY */
    private const string QUERY_SELECT_ALL_CATEGORIES = "SELECT * FROM Categories";
    这个常量在BindData里使用用来获取数据源
    private void BindData()
    {
     SqlConnection myConnection = new SqlConnection(ConnectionString);
     SqlDataAdapter ad = new SqlDataAdapter(QUERY_SELECT_ALL_CATEGORIES,
     myConnection);
     DataSet ds = new DataSet();
     ad.Fill(ds, "Categories");
     GridView1.DataSource = ds;
     GridView1.DataBind();
    }
     
     
    保存CheckBox的值
     GridView在分页过程中并不维护CheckBox的选择状态,幸运的是,我们可以使用Session来维护CheckBox的状态,这个功能使用RememberOldValues完成
    private void RememberOldValues()
    {
     ArrayList categoryIDList = new ArrayList();
     int index = -1;
     foreach (GridViewRow row in GridView1.Rows)
     {
       index = (int) GridView1.DataKeys[row.RowIndex].Value;
       bool result = ((CheckBox)row.FindControl("CheckBox1")).Checked;
     
     // Check in the Session
     if (Session[CHECKED_ITEMS] != null)
       categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
     if (result)
     {
     if (!categoryIDList.Contains(index))
       categoryIDList.Add(index);
     }
     else
       categoryIDList.Remove(index);
     }
     if (categoryIDList != null && categoryIDList.Count > 0)
       Session[CHECKED_ITEMS] = categoryIDList;
    }
     
    还原CheckBox的状态
       下一步,需要定义一个方法来还原Checkbox的状态值

     
    private void RePopulateValues()
    {
     ArrayList categoryIDList = (ArrayList)Session[CHECKED_ITEMS];
     if (categoryIDList != null && categoryIDList.Count > 0)
     {
     foreach (GridViewRow row in GridView1.Rows)
     {
       int index = (int)GridView1.DataKeys[row.RowIndex].Value;
     if (categoryIDList.Contains(index))
     {
       CheckBox myCheckBox = (CheckBox) row.FindControl("CheckBox1");
       myCheckBox.Checked = true;
     }
     }
     }
    }
     
    最后,在分页事件里调用上面两个方法

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
     RememberOldValues();
     GridView1.PageIndex = e.NewPageIndex;
     BindData();
     RePopulateValues();
    }
     
    注意的问题:
    1.在GridView中必须设置 DataKeyNames = "数据表的主键"
    2.设置CheckBox ID="checkbox1" 的属性(根据后台需要进行更改)
    3.Session[CHECKED_ITEMS] 为页面的checkbox列,要加双引号 Session["CHECKED_ITEMS"]