2012-02-05 1 views
0

ObjectDataSource에 바인딩 된 GridView가 있습니다. 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 메서드를 호출하기 전에 변수를 지울 필요가 있습니다.