2012-02-05 57 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方法之前清除該變量。