持续使用大型 ViewState
Datagrid 控件会在页面中添加大量的 ViewState,这一点令人讨厌,因为这会导致呈现给用户的页面的总体大小急剧增加。要使页面大小不增加,最简单的方法是无论对整个页面,还是单独对某些特定的控件,都禁用 ViewState。例如,如果页面不产生回发,那么对整个页面禁用 ViewState 是安全的。否则,请对两次回发之间状态信息不会发生更改的各个控件禁用 ViewState,或者对不需要隐藏字段来跟踪自身状态的那些控件禁用 ViewState。
对 Datagrid 控件或包含 Datagrid 的页面禁用 ViewState 时,如果 Datagrid 会启动回发事件,那么需要执行一些特殊的步骤。首先,必须在每次回发时在 Page_Load 中重新绑定 Datagrid。这有违常规做法(以及上述第二个问题中的描述)。但如果禁用 ViewState,该步骤是必需的,这样在执行 Page_Load 后可以正确地引发其他 Datagrid 事件。如果要处理以下 Datagrid 事件中的任何一部分(或全部),那么还需要在 ViewState 中手动存储一些 Datagrid 属性。例如,在禁用了 ViewState 的 Datagrid 中进行编辑时,只要是在 Page_Load 中第一次绑定 Datagrid 之前重新存储 EditItemIndex,且 Datagrid 处于编辑模式,那么只需将 EditItemIndex 储存到 ViewState 就够了。
表 1:Datagrid 事件与 ViewState 的依赖关系
| 事件 | 是否依赖于 ViewState? | 要存储在 ViewState 中的字段 |
| ItemCreated | 无 | |
| ItemDataBound | 无 | |
| SortCommand | 是 | SortExpression |
| EditCommand | 是 | EditItemIndex |
| PageIndexChanged | 是 | CurrentPageIndex |
| SelectedIndexChanged | 无 |
| Sub Page_Load If Not ViewState("EditItemIndex") Is Nothing Then Datagrid1.EditItemIndex = ViewState("EditItemIndex") End If If Not ViewState("CurrentPageIndex") Is Nothing Then Datagrid1.CurrentPageIndex = ViewState("CurrentPageIndex") End If BindGrid() End Sub Sub BindGrid() Dim DV As DataView DV = GetDataSource() DV.Sort = ViewState("SortExpression") Datagrid1.DataSource = DV Datagrid1.DataBind() End Sub Sub Datagrid1_SortCommand(s As Object, e As DataGridSortCommandEventArgs) ViewState("SortExpression") = e.SortExpression BindGrid() End Sub Sub Datagrid1_EditCommand(s As Object, e As DatagridCommandEventArgs) Datagrid1.EditItemIndex = e.Item.ItemIndex ViewState("EditItemIndex") = e.Item.ItemIndex BindGrid() End Sub Sub Datagrid1_PageIndexChanged(s as Object, e As DataGridPageChangedEventArgs) Datagrid1.CurrentPageIndex = e.NewPageIndex ViewState("CurrentPageIndex") = e.NewPageIndex BindGrid() End Sub |
| Sub DataGrid1_ItemDataBound(source As Object,e As DataGridItemEventArgs) If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then If e.Item.DataItem("ForumDate") < DateTime.Today Then e.Item.Cells(1).BackColor =System.Drawing.Color.FromName("#ffccff") End If End If End Sub |
http://dev.xuezhishi.net/website/NET/2007-10-17/20791.html