2011-07-01 2 views
3

포스트 백간에 포커스를 유지하는 것은 분명히 어려운 작업입니다. Google을 검색하면 같은 일을 원하는 수많은 사람들을 찾을 수 있습니다. 그러나 모두 다르게 그리고 대부분 사용자 정의. 특히 사용자 지정 구현을 피하고 싶습니다. .NET에서 지원되는 방식이있는 경우 특히 그렇습니다. 아주 깊은 검색을 한 후에 만 ​​PostBackOptions.TrackFocus를 보았습니다. 조용히 다른 스택 오버 플로우 게시에 언급되었습니다. MSDN에 따르면PostBackOptions.TrackFocus를 사용하여 포스트 백간에 컨트롤 포커스 유지

것은 가져 오거나 다시 게시 이벤트가 현재 스크롤 위치에 페이지를 반환하고 현재 컨트롤에 포커스를 반환해야하는지 여부를 나타내는 값을 가져 오거나 설정 "

이런 세상에,이 지원됩니다. .NET에 의한 컨트롤의 초점 설정 방법은 .NET에서 어떻게 알 수 있습니까? System.Web.UI.Control에 대한 MSDN 설명서를 살펴보면 다음과 같습니다. 흥미로운 방법 :

public virtual void Focus() 

"포커스 메서드를 사용하여 웹 페이지의 초기 포커스를 컨트롤로 설정합니다. 페이지가 선택 제어 와 브라우저에서 열립니다. "

좋아, 명확하게 재정의. 그러나 그렇게하는 권장되는 방법은 무엇입니까? 그것은 무효 반환합니다. 아니 예. 사람의 예를 찾을 수 없습니다 그러나이 메서드를 재정의하고 예외를 throw하는 것 외에는 ASP.NET이 포스트 백보다 먼저 포커스가있는 컨트롤에 포커스를 두는 방식이 아니라는 것을 알 수 있습니다. 결코 호출되지 않습니다.

Firebug를 사용하여 디버깅을 한 후, PostBackOptions.TrackFocus가 작동하는 것을 발견했습니다! 때로는 컨트롤의 포커스가 컨트롤 __doPostBack JavaScript 메서드를 호출합니다. 포스트 백을 시작하는 다른 컨트롤 (컨트롤 내에서 Enter 키를 누를 때)은 ASP 숨김 필드 __LASTFOCUS를 업데이트하지 않는 WebForm_OnSubmit()을 호출합니다. __doPostBack은 숨겨진 필드를 설정 한 후 WebForm_OnSubmit()을 호출합니다.

여기가 현재 붙어 있습니다. 마치 __doPostBack을 호출해야 할 필요가있는 것처럼 보입니다. TrackFocus 사용에 대한 문서는 매우 적습니다. 누구도 여기에서 어떤 조언을합니까? (예 : 필드에 __LASTFOCUS 숨겨진 필드에 저장 초점 모든 컨트롤에 대한 이벤트 클라이언트 측 입력)

http://www.codeproject.com/KB/aspnet/MainatinFocusASPNET.aspx

을 경우 '

답변

1

나는이 문서의 방법을 사용하여 포스트 백 전체의 초점을 유지했습니다 __LASTFOCUS가 페이지에 나타나면 지금까지 남은 대부분의 시간을 가져야합니다 ...

참고 : 추가 자바 스크립트를 부풀려서 보관하는 방법을 찾는 것이 좋습니다. __VIEWSTATE 예를 들면.

내 페이지 중 일부가 숨겨진 __LASTFOCUS 필드를 포함하고 일부 페이지가 포함되지 않았다는 것을 알기 전까지는 꽤 잘 작동했습니다. (그게 내가 주위를 검색하고 귀하의 질문을 찾으라는 메시지가) 지금은 __LASTFOCUS 항상 초점을 추적하고 싶은 모든 페이지에 나타납니다 있는지 확인하는 방법을 알아 내려고 노력하고있어 ... (것 같습니다 그것에 대해 별도의 질문을 열어야 함)

+0

내 문제는 내가 __LASTFOCUS을 제어하지 않는다는 것입니다. 나는 그것을 ASP에 사용하는 방법을 모르지만 클라이언트 측에서 스크립트를 작성할 수 있기 때문에 혼란스러워 할 수있는 것은 무엇입니까? ASP가 무작위로 제거하면 어떻게됩니까? (그랬던 것처럼) 괜찮지 않아. 마스터 페이지에 자신 만의 lastfocus 숨겨진 요소를 추가하는 것이 그 방법 일 것입니다. –

+0

또 다른 문제가 있습니다. 포스트 백 후에 페이지에 컨트롤을 추가하는 것입니다. 숨겨진 요소에 마지막 포커스를 저장하고 다시 게시하십시오. 페이지에 포커스가있는 컨트롤 위에 컨트롤을 동적으로 추가합니다. 고유 한 ClientId가 변경되었으므로 ID가 변경되어 컨트롤에 포커스가 유지되지 않습니다. –

+0

@ Sam.Rueby 컨트롤의 ID가 포스트 백에서 변경되지 않는 한이 메서드는 여전히 작동해야한다고 생각합니다. 특히 __LASTFOCUS 숨겨진 필드를 별도로 작성하는 경우가 그렇습니다. 참고 : 모든 페이지를로드 할 때 Page.SetFocus()를 사용하면 __LASTFOCUS가 있는지, 질문하고 대답 할 수 있습니다. http://stackoverflow.com/questions/6684181/why-does-lastfocus-hidden-field-show-up-on- only-some-asp-net-pages –

0

내가 방금 한 일이 여기있다.

 ScriptManager.RegisterStartupScript((WebControl) sender, sender.GetType(), "RestoreFocusMethod", "document.getElementById(\"" + ((WebControl) sender).ClientID + "\").focus();", true); 
: 당신은 전송 오브젝트로 초점을 복원하는 코드 줄을 사용할 수 있습니다

protected void myEventHandler(object sender, EventArgs e) 

: 그 사건을 담당하고이 같은 서명이 뒤에 코드에서 핸들러를 가지고 가정

보내는 컨트롤의 Focus() 메서드를 사용하면 페이지가 다시 배치되지만 (조금 아래로 스크롤 한 경우) 아름답게 작동합니다. 당신이 당신의 컨트롤에 대한 특정 핸들러가있는 경우, 당신은이처럼 WebControl에 보낸 사람을 캐스팅하는 대신 컨트롤 자체를 사용할 수 있습니다이와

protected void CityListDropDown_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ... 
     ScriptManager.RegisterStartupScript(CityListDropDown, CityListDropDown.GetType(), "CityDropDownRefocus", "document.getElementById(\"" + CityListDropDown.ClientID + "\").focus();", true); 
    } 
관련 문제