2012-02-05 101 views
0

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

回答

0

RowDataBound当GridView获取数据绑定时(表示触发SelectMethod),会触发事件。

现在,切换属性如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方法之前清除该变量。