안녕하세요? 웹지니입니다.
앞서 심재운 방장님께서 답변 주신 것은 포스트백을 발생시킨 컨트롤의 이벤트 핸들러에서만
해당 컨트롤을 찾을 수 있는 방법이고 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를 저장할 히든필드의 이름입니다.
도움이 되셨기를...