2013-03-07 3 views
0

ASP에서 반복적 인 문제는 Page_Load 이벤트가 발생하기 전에 이벤트를 잡는 것입니다. 예를 들어 여기 gridView 클래스에서 상속 한 gridview를 사용자 지정합니다. 드롭 다운 목록을 추가하여 점프 할 페이지를 선택합니다 (PageIndexChanged). 이 드롭 다운 목록의 SelectedIndexChanged 이벤트가 렌더링 된 후에 호출된다는 점을 제외하면 모든 것이 훌륭합니다 (그리드와 드롭 다운은 각 포스트 백마다 재생성됩니다). 그래서 나는 그것에서 올바른 가치를 선택할 수 없습니다.Page_Load 전에 이벤트를 잡는 방법

내 이벤트는 두 번째 포스트 백에서만 발생하므로 항상 포스트 백이 늦습니다.

해당 드롭 다운은 RowCreated 이벤트에 추가됩니다. 다른 이벤트에서 시도했지만 너무 늦었거나 너무 일찍 시작했는지 (너무 늦은 경우 렌더링되지 않았거나 너무 일찍 누락 된 요소).

모든 솔루션?

PS : 나는 나를 도울 수 this article을 발견,하지만 난 그것을 수행하는 방법 쉬르 아니에요 :

포인트를 확장/제어를 만들거나 enheriting 때 고려해야 할 :

  1. 당신은이 base.CreateChildControls()를 호출 한 CreateChildControls를 재정 의하여 이벤트를 발생시킬 항목을 만들면 원하는 모든 작업을 수행 할 수 있습니다. 즉, 행을 추가하십시오.
  2. 목록 항목 데이터 바인딩 방법은 매우 복잡합니다. 정숙하지 않습니다. DataBind()를 재정 의하여 간단하게 만들어야합니다. 어린이를 지우고 EnsureChildControls()를 호출 한 다음 새로운 행을 추가합니다. ..이 방식은 ViewStated, persisted 및 event managed를 훌륭하게 처리합니다. 훨씬 간단합니다.
  3. 다시 목록 항목 : 너무 일찍 자녀를 만들지 마십시오. OnInit 또는 onLoad에서 직접 하위 컨트롤을 만들지 마십시오. 그것의 실수는 입니다. 가장 좋은 방법은 이 필요할 때 시스템이 EnsureChildControls를 호출하도록하는 것입니다 (첫 페이지로드시 PreRender에서, PostBack에 어린이 용 이벤트가있는 경우 ). 에서 더 나빠질 때 OnInit, EnsureChildControls()를 호출합니다.

답변

1

은 MSDN 페이지는 이후 ASP.NET Page Life Cycle Overview입니다, 그것은 당신에게 페이지의 수명주기 동안 발생하는 모든 이벤트를 알려주는 유용한 테이블이 있습니다.

PreInit

시작 단계 완료 및 초기화 단계가 시작되기 전에 후 제기 :

당신은 아마 (위의 링크에서) 다음 중 하나를 원할 것입니다.

를 사용하여 다음이 이벤트 :

  • 이 페이지가 처리되는 것은 이번이 처음이다 있는지 여부를 확인하려면 IsPostBack을 속성을 확인합니다. 이 시점에서 IsCallback 및 IsCrossPagePostBack 속성도 설정되었습니다.
  • 동적 컨트롤을 만들거나 다시 만듭니다.
  • 동적으로 마스터 페이지를 설정하십시오.
  • Theme 속성을 동적으로 설정하십시오.
  • 프로필 속성 값을 읽거나 설정합니다.

초기화

모든 컨트롤이 초기화 된 후 제기하고 피부 설정이 적용되고있다. 개별 컨트롤의 초기화 이벤트는 페이지 초기화 이벤트 전에 발생합니다.

컨트롤 속성을 읽거나 초기화하려면이 이벤트를 사용하십시오.

InitComplete 페이지의 초기화 단계의 끝에서 발생합니다. Init 및 InitComplete 이벤트 간에는 하나의 작업 만 발생합니다. 뷰 상태 변경 사항 추적이 설정됩니다. 뷰 상태 추적을 사용하면 프로그래밍 방식으로 ViewState 컬렉션에 추가 된 모든 값을 컨트롤에서 유지할 수 있습니다. 뷰 상태 추적이 설정 될 때까지 뷰 상태에 추가 된 모든 값은 포스트 백간에 손실됩니다. 컨트롤은 일반적으로 Init 이벤트를 발생시킨 후 즉시 뷰 상태 추적을 켭니다.

이 이벤트를 사용하여 다음 재 게시 이후에 유지되도록하려는보기 상태를 변경합니다. 페이지가로드 이후에 발생

예압 자체 모두 컨트롤 상태를 확인하고, 이후 요청 인스턴스에 포함되어있는 게시 데이터를 처리한다.

+0

* "나는 다른 사건을 시도했지만 너무 늦었거나 너무 일찍 했나"*. 나는 그가 그걸 이미 본 줄 알았는데 :) – mattytommo

+0

@mattytommo - 가정이 엉덩이를 만들고. 잠깐, 맞지 않아요;) – Jamiec

+0

하하, 가정은 모든 가정의 가정이라고 말합니다. – mattytommo

0

마침내 내가 위에서 준 기사, and this one 및 검색을 많이 내 문제 덕분에 해결 보인다 확인 :

public class MyGridView : GridView 
{ 
    TextBox txtSearch; 

    protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding) 
    { 
     int numRows = base.CreateChildControls(dataSource, dataBinding); 

     // Create a new row 
     GridViewRow rowSearch = base.CreateRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal); 

     //convert the existing columns into an array, initialize and then add the row to the previously created table 
     DataControlField[] fields = new DataControlField[this.Columns.Count]; 
     this.Columns.CopyTo(fields, 0); 
     this.InitializeRow(rowSearch, fields); 

     TableCell cellSearch = new TableCell(); 
     rowSearch.Cells.Add(cellSearch); 

     txtSearch = new TextBox(); 
     txtSearch.Text = this.SearchTextboxDefaultValue; 
     txtSearch.ID = "txtSearch"; 
     txtSearch.AutoPostBack = true; 
     txtSearch.TextChanged += new EventHandler(txtSearch_TextChanged); 
     cellSearch.Controls.Add(txtSearch); 

     this.Controls[0].Controls.Add(rowSearch); // Controls[0] is a Table element 

     return numRows; 
    } 

    protected void txtSearch_TextChanged(object sender, EventArgs e) 
    { 
     string search = (sender as TextBox).Text; 
     DataTable dt = new DataTable(); 

     // We fill in dt with results, and rebind it 

     this.DataSource = dt; 
     this.DataBind(); 
    } 
} 

그리고 Page.cs의 :

private DataTable dt; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    sampleDataTable(); 
    if (!Page.IsPostBack) 
    { 
     myGrid.DataSource = dt; 
     myGrid.DataBind(); 
    } 
} 

private void sampleDataTable() 
{ 
    // Populate the dataTable 
} 

감사 너

관련 문제