如果你需要在一個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