ASP.NET中Datagrid常见错误(三)
来源:互联网 发布:网络克隆是什么意思啊 编辑:程序博客网 时间:2024/04/25 18:03
持续使用大型 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 无
清单 1:启用编辑、排序和分页,但禁用 ViewState 的 Datagrid 的示例代码。
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
使用 ItemDataBound 或 ItemCreated 事件时,忘记检查适当的 ListItemType
Datagrid 控件对每个数据行引发两个事件。首次将每行添加到 Datagrid 时将引发 ItemCreated 事件,将数据绑定到每行时将引发 ItemDataBound 事件。添加单元格到 Datagrid 的表格输出时,这些事件可以用于控制每个单元格的外观或内容。例如,可以基于数值的范围修改单元格的背景颜色。但关键是要记住,这些事件的引发针对的是所有 Datagrid 项目类型,包括页眉、页脚和分页程序项目。如果执行 ItemDataBound 事件期间,没有在引用项目的数据之前仔细检查项目类型,第一个项目(通常是标题行)就将发生错误。如果 Datagrid 启用了分页,且将其设置为在顶端显示,那么第一个项目就会成为分页程序项目。以下示例代码显示如何在引用项目数据之前进行正确的 ListItemType 检查。不要忘了 AlternatingItem!
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
需要对生成的 HTML 有更多的控制时,过多地使用了 Datagrid(Repeater 也许是更好的选择)
如果懒散的程序员喜欢 Datagrid 控件(因为 Datagrid 控件为他们完成了很多工作),那么有着极强控制欲的程序员必定喜欢 Repeater 控件。如果需要或希望完全控制创建的所有 HTML,请使用 Repeater 控件,它能帮助您完成该任务。Repeater 控件在性能上也略占优势,因为它不像 Datagrid 控件的所有内置功能那样占用系统资源。也可以考虑使用折衷的 DataList 控件,它具备编辑和排序功能,同时还具有在一行内重复显示记录的功能。
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 无
清单 1:启用编辑、排序和分页,但禁用 ViewState 的 Datagrid 的示例代码。
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
使用 ItemDataBound 或 ItemCreated 事件时,忘记检查适当的 ListItemType
Datagrid 控件对每个数据行引发两个事件。首次将每行添加到 Datagrid 时将引发 ItemCreated 事件,将数据绑定到每行时将引发 ItemDataBound 事件。添加单元格到 Datagrid 的表格输出时,这些事件可以用于控制每个单元格的外观或内容。例如,可以基于数值的范围修改单元格的背景颜色。但关键是要记住,这些事件的引发针对的是所有 Datagrid 项目类型,包括页眉、页脚和分页程序项目。如果执行 ItemDataBound 事件期间,没有在引用项目的数据之前仔细检查项目类型,第一个项目(通常是标题行)就将发生错误。如果 Datagrid 启用了分页,且将其设置为在顶端显示,那么第一个项目就会成为分页程序项目。以下示例代码显示如何在引用项目数据之前进行正确的 ListItemType 检查。不要忘了 AlternatingItem!
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
需要对生成的 HTML 有更多的控制时,过多地使用了 Datagrid(Repeater 也许是更好的选择)
如果懒散的程序员喜欢 Datagrid 控件(因为 Datagrid 控件为他们完成了很多工作),那么有着极强控制欲的程序员必定喜欢 Repeater 控件。如果需要或希望完全控制创建的所有 HTML,请使用 Repeater 控件,它能帮助您完成该任务。Repeater 控件在性能上也略占优势,因为它不像 Datagrid 控件的所有内置功能那样占用系统资源。也可以考虑使用折衷的 DataList 控件,它具备编辑和排序功能,同时还具有在一行内重复显示记录的功能。
- ASP.NET中Datagrid常见错误(三)
- ASP.NET中Datagrid常见错误(一)
- ASP.NET中Datagrid常见错误(二)
- ASP.NET中Datagrid常见错误
- ASP.NET中Datagrid常见错误
- ASP.NET中Datagrid常见错误
- ASP.NET中Datagrid常见错误
- ASP.NET中Datagrid常见错误
- ASP.Net开发者常见 Datagrid 错误
- ASP.Net开发者常见 Datagrid 错误
- ASP.Net开发者常见Datagrid错误
- asp.net常见错误
- Asp.net 常见错误
- ASP.net常见错误解决方案
- ASP.NET常见错误提示
- ASP.NET常见错误大全
- ASP.NET MVC 常见错误
- ASP.NET常见错误大全
- 线程 continue -- 4
- 我就是海归,不服单挑(ZT)
- 提问的艺术
- ASP.NET中Datagrid常见错误(一)
- ASP.NET中Datagrid常见错误(二)
- ASP.NET中Datagrid常见错误(三)
- 中国历史车轮就是这样转动的
- 人生25句经典
- 关于ant,不得不说的蚂蚁(一)
- 在VC中如何实现对存储过程的循环调用?
- GMail is great, but what I am really looking for is myKM service!
- 无限级目录树+记忆节点状态(完全JavaScript版)
- [zt]为你的 Blog 添加“天气预报”功能。
- cnforyou被收购了,没地方买书了