2011-12-08 3 views
1

데이터베이스에서 채워진 GridView가 있고 텍스트 상자가 있습니다. 뒤에있는 코드를 통해 각 행의 텍스트 상자를 특정 이벤트에 구독하려고하지만 행의 필드가 일부 if 문과 일치하는 경우에만 해당합니다.RowDataBound에서 프로그래밍 방식으로 생성 된 이벤트가 실행되지 않음

그래서 나는 다음과 같습니다

문제가
protected void grdRates_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    TextBox txt = (TextBox)e.Row.FindControl("txtValue"); 
    DataRowView dataView = (DataRowView)e.Row.DataItem; 
    if ((bool)dataView["isAuto"]) 
    { 
     txt.AutoPostBack = true; 
     txt.TextChanged += new EventHandler(txt_TextChanged); 
    } 
} 

protected void txt_TextChanged(object sender, EventArgs e) 
{ 
    //Other stuff here 
} 

는, 텍스트 변경 이벤트가 결코 발사하지 - AutoPostBack 속성들이 텍스트 상자 밖으로 이동하면 다시 페이지 게시물로 설정할 수는 있지만되고있다 텍스트 변경 이벤트가 발생하지 않습니다. 내가 여기서 뭔가를 놓치고 있니?

+0

포스트 백에서 행 databound가 실행됩니까? 이벤트는 코드 뒤에서 코드가 설정 될 때 포스트 백에 바인딩되어야합니다. – WraithNath

+0

if 루프가 평가됩니까? – V4Vendetta

답변

1

데이터 바인딩시 이벤트 처리기를 추가하지 않도록 구현을 변경해야 페이지 수명주기와 관련된 모든 문제가 발생할 수 있습니다.

대신 AutoPostBack 속성을 선언적으로 바인딩하고 여기에 이벤트 처리기를 설정할 수도 있습니다. (입력이 끊어지면 즉 초점)

<asp:TextBox ID="SomeInput" runat="server" ... 
    AutoPostBack='<%# (bool)Eval("IsAuto")' 
    OnTextChanged="SomeInput_TextChanged" /> 

이벤트는 자동으로 실행됩니다 IsAuto는 == true의 경우, 사용자가 같은 행에있는 다른 버튼 입력의 텍스트를 클릭하면하지만 여전히 발광 할 수 있습니다 변경되었을 때 . 그래서 당신은 이벤트 처리기에서 추가 검사가 필요합니다

protected void SomeInput_TextChanged(object sender, EventArgs e) 
{ 
    TextBox input = (TextBox)sender; 
    if(input.AutoPostBack) 
    { 
     // Other stuff here 
    } 
} 

공지 사항이 선언적으로 우리는 페이지 수명주기에 대해 덜 걱정해야하는 바인딩, 우리는 이벤트 핸들러에 대해 확인하기 위해 입력의 바인딩 속성을 사용하여 .

관련 문제