ObjectDataSource + GridView =触发两次

时间:2012-02-05 14:40:40

标签: asp.net gridview objectdatasource

我有一个绑定到ObjectDataSource的GridView。我明白了,SelectMethod和SelectCountMethod被触发了两次。 在GridView RowDataBound中我有gv.ShowFooter = false; 当我评论这一行时,事件只发生一次。为什么会这样?如何解决它?我不明白,为什么在数据绑定控件结果中隐藏一个元素是重新绑定ObjectDataSource?

1 个答案:

答案 0 :(得分:0)

当GridView获取数据绑定时(意味着触发SelectMethod),会触发

RowDataBound事件。

现在,切换ShowFooter之类的属性需要网格重新创建行,这意味着再次绑定数据。这就是为什么对象数据源会再次被触发的原因。

解决方案是先设置ShowFooter属性(而不是RowDataBound)。如果这不可行,那么将对象数据源类中的逻辑放入缓存数据中,这样就不必访问数据存储两次。例如,

// Code Behind Class
public partial class MyPage : System.Web.UI.Page
{

  private object _data;

  public static object SelectData()
  {
     // get the current page instance
     var page = HttpContext.Current.CurrentHandler as MyPage;
     if (null != page._data)
     {
         return page._data;
     }

     // logic to retrieve the data
     ...
     _data = ...
     return _data;
  }

...


  private void RefreshGrid()
  {
     _data = null; // force the data-source to go to database again
     grid.DataBind();
  }
}

免责声明:未经测试的代码仅用于说明目的

因此,在上面的代码中,使用页面代码隐藏的静态方法来获取数据。页面类中的局部变量用于缓存数据。另请注意,为了刷新网格,您可能需要在网格上调用DataBind方法之前清除变量。