你们真的了解DataGrid的吗?

1.Datagrid控件的数据绑定过程

在调用DataBind方法时,DataGrid控件的数据绑定过程开妈,DataGrid类并没有对方法进行重写,而是直接利用BaseDataList类提供的方法,其实现也简单,只是引发此类的DataBinding事件,BaseDataList类的内部处理程序首先清除所有的子控件和视图状态,然后调用一个名为CreateControlHierarchy的保护方法,如下是伪代码所示:
protected virtual void OnDataBinding(EventArgs e)
{
//call the parent's event handler
base.OnDataBinding(e);
//clear the collection of child controls
Contols.Clear();
//Clear the view state container
ClearChildViewState();
//Build the grid
CreateControlHierarchy();
// Monitor the view state for changes
TrackViewState()

}
CreateControlHierarchy方法负责建立实际组成最后网格的控件和HTML代码的层次结构,在
CreateControlHierarchy方法中的最重要的就是各个网格项的创建,对于每个创的网格项,需要引发一组相关事件:ItemCreated和ItemDataBound

2.为什么ItemCreated 被触发两次

当包含一个DataGrid控件的页面回传时,ItemCreated事件被触发两次,在页面视图状态恢复期间该事件被第一次触发,事实上DataGird控件将其数据行对象存储在视图状态中,当视图状态被重新创建时,所有的项都被实例化并重新进行初始化。
      注意,在这种情况下,对于存储在视图状态中的所有项都触发ItemCreate事件,因此,对于在前一页中显示的所有项的也一样,例如,假设网格显示10行,然后你单击查看另一页,假定新的这一页显示3行,在处理页面请求期间,DataGrid控件首先触发ItemCreated事件10次,对于被恢复的缓存在视图状态中的每一项触发一次,接下来当生成新的页的输出时,DataGrid为显示新页中的每一页触发成对的ItemCreated事件和ItemDataBound事件,这时要触发3次;
       当正在构建页面,准备生成DataGrid输出代码时,第二次通知到达。在这种情况下,ItemCreated事件后将跟随ItemDataBound事件,
      如何能够防止事件处理程序在视图状态恢复期间被调用呢?最大的困难是没有与事件数据结构相关的信息使你能够对情况进行判断,一个可行的办法是使用一个全局状态变量,即一个Boolean标记,来跟踪代码是否进入数据绑定阶段,当此标记设置为false时,ItemCreated被调用,此调用是因为恢复视图状态而进行。数据绑定阶段的开始由DataBinding事件来表示;
<asp:datagrid runat=server id="grid"
onitemcreated
="ItemCreated"
onitemdatabound
="ItemDataBound"
ondatabinding
="TraceDataBinding" />
 DataBinding事件的处理程序的结构很简单,如下所示
void TraceDataBinding(object sedner,EventArgs e)
{
m_isBindingData
=true;
Trace.Warn(
"Data binding.");
}


void ItemCreated(onbject sender,DataGridItemEventArgs e)
{
if(m_isBindingData)
Trace.Warn(
"Created"+e.Item.ItemType.ToString());
}

      最后,无论如何设置ShowFooter属性和ShowHeader属性,都要创建军脚注项和标题项,只有在AllowPageing 属性被设置为true时,才创建分面器对象,网格由两个分页器对象组成,一个位于第一行,另一个位于最后一行,通过使用PageStyle属性,你能够决定有多少个分页器,或者显示哪个分页器,如果需要,DataGrid也可以有两个分页器对象同步工作,在任何情况下,页面都要触发两次 ItemCreate事件
posted @ 2007-05-15 22:12  过河卒A  阅读(602)  评论(1编辑  收藏  举报