CAFE

ASP.NET 질문

Re:PostBack을 발생한 컨트롤은?

작성자웹지니™|작성시간07.02.21|조회수194 목록 댓글 2

안녕하세요? 웹지니입니다.

 

앞서 심재운 방장님께서 답변 주신 것은 포스트백을 발생시킨 컨트롤의 이벤트 핸들러에서만

해당 컨트롤을 찾을 수 있는 방법이고 Page_Load 이벤트에서 포스트백을 발생시킨 컨트롤을

찾으려면 조금 다른 방법이 필요합니다.

 

먼저 각 컨트롤들이 포스트백을 발생시키는 방법을 이해해야 하는데요.

먼저 Button 컨트롤의 경우 <input type="submit">으로 렌더링되기 때문에 이 경우 Button 컨트롤의 ClientID 속성 값이 Post로 전달됩니다.

 

ImageButton의 경우는 조금 더 애매한게 ImageButton 컨트롤의 ClientID 속성에 .x와 .y가 덧붙은 값이 Post로 전달됩니다. 다행히 LinkButton 컨트롤은 __doPostBack 함수를 호출해서 포스트백을 구현하기 때문에 이 값은 히든 필드인 __EVENTTARGET으로 넘어가지요.

 

즉, __doPostBack 자바스크립트 함수에 의해 전달되는 이벤트를 제외하고는 모두 Request.Form 컬렉션에서 찾아야 하며 그 중 ImageButton 컨트롤은 ClientID.x, ClientID.y와 같은 식으로 전달되므로 결국 아래와 같은 코드를 작성해야 합니다.

 

String postBackControlID = String.Empty;

if (Request.Form[Page.postEventSourceID] != String.Empty) {
 postBackControlID = Request.Form[Page.postEventSourceID];
}
else {
 foreach (String key in Request.Form.AllKeys) {
  String tempKey = key;
  if (tempKey.IndexOf(".") >= 0) {
   tempKey = tempKey.Substring(0, key.IndexOf("."));
  }
  Control c = this.FindControl(tempKey);

  if (c != null) {
   postBackControlID = c.ClientID;
   break;
  }
 }
}

 

이해가 되시려는지 모르겠네요. 간단히 말씀드리면 __EVENTTARGET 필드에 넘겨진 값이 있으면 그 넘이 포스트백 컨트롤 ID이고 그렇지 않으면 FORM 컬렉션에 전달된 값을 FindControl 함수에 전달해서 해당 ID를 갖는 컨트롤을 찾아 컨트롤이 있으면 그 넘의 ClientID를 포스트백 컨트롤 ID로 인식한다는 것입니다.

 

저렇게 찾아진 postBackControlID 값을 FindControl 메서드에 전달하면 해당 컨트롤에 대한 참조를 찾을 수 있습니다.

 

참고로 Page.postEventSourceID는 Page 클래스의 static 상수로 포스트백을 발생시킨 ID를 저장할 히든필드의 이름입니다.

 

도움이 되셨기를...

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자심재운 | 작성시간 07.02.21 웹지니님께서 올려주신 강좌를 강추합니다. ^^
  • 작성자꿈꾸는마시마로 | 작성시간 07.02.22 감사합니다 ^^ 많은 도움 되었습니다. ^^
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼