如果你需要在一个GridView中加一个CheckBox,以选择某行数据,然后进入下一页继续选择,而返回上一页时仍旧能够显示你已经选择了的数据 行,那么,这里将提供一种方式给你。因为分页时,页面发生变化时,是要postback回服务器的,这样,虽然你做了选择,但是未更新到服务器,所以,不 做处理的话是保存不住已经选择的项的。
思路:通过一个ArrayList来保持你已经选择的项的ID,当页索引变化时,将触发DataBinding事件,在该事件内调用 CollectSelected()方法,来保存所有CheckBox选中的行,去掉那些未选中的行ID。在RowDataBound(),通过 SelectedItems中保存的ID来设置是否选中,以回显你的操作。需要注意的是,在你提交的时候,一定要再调用一次 CollectSelected(),以最后一次收集当前页的选中情况。
1 protected ArrayList SelectedItems
2 {
3 get
4 {
5 return (ViewState[ " mySelectedItems " ] != null ) ? (ArrayList)ViewState[ " mySelectedItems " ] : null ;
6 }
7 set
8 {
9 ViewState[ " mySelectedItems " ] = value;
10 }
11 }
12 /// <summary>
13 /// 从当前页收集选中项的情况
14 /// </summary>
15 protected void CollectSelected()
16 {
17 ArrayList selectedItems = null ;
18 if ( this .SelectedItems == null )
19 selectedItems = new ArrayList();
20 else
21 selectedItems = this .SelectedItems;
22 for ( int i = 0 ; i < this .gvWorks.Rows.Count; i ++ )
23 {
24 CheckBox cb = (CheckBox)gvWorks.Rows.FindControl( " cbChoose " );
25 string id = ((Label)gvWorks.Rows.FindControl( " lbID " )).Text;
26 if (selectedItems.Contains(id) && ! cb.Checked)
27 selectedItems.Remove(id);
28 if ( ! selectedItems.Contains(id) && cb.Checked)
29 selectedItems.Add(id);
30 }
31 SelectedItems = selectedItems;
32 }
33
34 protected void gvWorks_DataBinding( object sender, EventArgs e)
35 {
36 // 在每一次重新绑定之前,需要调用CollectSelected方法从当前页收集选中项的情况
37 CollectSelected();
38 }
39 protected void gvWorks_RowDataBound( object sender, GridViewRowEventArgs e)
40 {
41 // 这里的处理是为了回显之前选中的情况
42 if (e.Row.RowIndex > - 1 && SelectedItems != null )
43 {
44 DataRowView row = e.Row.DataItem as DataRowView;
45 CheckBox cb = (CheckBox)e.Row.FindControl( " cbChoose " );
46 Label lbID = (Label)e.Row.FindControl( " lbID " );
47 if (SelectedItems.Contains(lbID.Text))
48 cb.Checked = true ;
49 else
50 cb.Checked = false ;
51 }
52 }
53