我在带有搜索按钮的页面上有一个GridView。 GridView在开始时不可见,因此用户必须在检索结果之前单击搜索。 DataSourceID设置为ObjectDataSource的ID。调用click时,将从单击处理程序调用以下方法:
private void PopulateGrid()
{
gv.Visible = true;
gv.DataBind();
}
从Page_Load处理程序调用相同的方法时出现问题。我们在会话中存储用户的搜索词,并在第一次访问页面时检索它们,如下所示:
if(!PostBack && Session["search"] != null)
{
SetSearchFromSession();
PopulateGrid();
}
这种情况下的问题是ObjectDataSource的Selecting事件被触发两次。一旦GridView变为可见,并且再次调用DataBind()时。我通过替换gv.Visible = true
来解决这个问题。对于Page_Load中的PopulateGrid();
。
但我想了解发生了什么。当按钮单击事件中的调用没有时,为什么在页面加载时设置GridView会导致DataBinding?
答案 0 :(得分:1)
如果以声明方式设置datasourceid,那么它将在PreRender之后调用,如果调用DataBind,它将再次被调用。 (两次)
DataBinding
在控制的PreRender事件之后发生,该事件发生在之后 page的PreRender活动。 (这适用于DataSourceID的控件 属性以声明方式设置。否则事件发生在你身上 调用控件的DataBind方法。)
此事件标记绑定控件的进程的开始 对数据。如果,请使用此事件手动打开数据库连接 必需,并在查询之前动态设置参数值 运行