2014-12-25 5 views
0

이전 게시물 참조 : Focus lost on partial postback with UserControls inside UpdatePanel 여기서 양식 내의 웹 페이지 컨트롤에 완벽하게 적용됩니다. 그러나 UC를 detailsview 템플릿 필드 (편집 + 삽입 용)에 넣었습니다.UC가 detailsview 컨트롤에 포함되어있을 때 TextChanged 포스트 백 이후에 사용자 정의 컨트롤이 올바르게 유지되지 않습니다.

UC에는 DetailsView의 편집 모드 및 삽입 모드 중에 UC 텍스트 상자 (AutoPostback = True)의 TextChanged 이벤트 다음에 텍스트 서식 및 컨트롤의 스타일을 조정하는 데 필요한 UpdatePanel이 포함되어 있습니다.

마찬가지로 DetailsView 컨트롤이 편집 모드에 있고 사용자가 UC에서 텍스트를 변경하면 textchanged 이벤트가 발생하고 사용자 입력 값의 유효성이 검사되고 OK를 누르면 쉼표 기호 (쉼표) UC 텍스트 상자 텍스트에 추가되지만 포커스는 DetailsView의 다음 필드로 이동하고 QUICKLY는 UC 컨트롤로 돌아갑니다.

포커스 및 탭 순서 이 DetailsView 컨트롤 외부에서 완벽하게 작동하기 때문에 참조 된 게시물에 명시된대로 UC가 업데이트 패널에 래핑 될 때이 잘못된 포커스 이동이 발생하지 않습니다.

다음은 template-field-EDIT (only)에 대한 aspx 마크 업입니다.

<asp:TemplateField HeaderText="Initial Mileage" SortExpression="IMilage"> 
<EditItemTemplate> 
<asp:UpdatePanel ID="updpnlIMilage" runat="server" UpdateMode="Conditional" > 
    <ContentTemplate> 
     <TGANumeric:GANumeric ID="ucnumIMileage" runat="server" 
      Caption="Initial Mileage" HideCaption="True" Width="160" 
      DisplayMask="999,999" InputMask="999999" 
      Enabled="True" IsRequired="False" 
      MinNumber="0" MaxNumber="999999" 
      Text='<%# Bind("IMilage") %>' 
      TabIndex="0" 
      /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="ucnumIMileage" /> 
    </Triggers> 
</asp:UpdatePanel> 
</EditItemTemplate> 

미리 감사드립니다. 귀하의 의견을 환영합니다. 감사 ... J. (부분)

답변

0

이 스레드의 모든 주석을 기반으로 탭 이동의 실제 근본 원인을 설명하고자합니다.
1) 사용자 정의 컨트롤에 코딩 문제 또는 이벤트 문제가 없습니다.

2) 마스터 페이지, 콘텐츠 페이지, Ajax 업데이트 패널/중첩 된 업데이트 패널, 세부 사항보기 및 사용자 정의 컨트롤을 포함하는 템플릿 필드의 계층화에 코딩 문제 또는 이벤트 문제가 없었습니다.

3) 진짜 원인은 페이지가 페이지/양식의 "상태"(상태)를 기반으로 양식의 웹 제어를 조정하는 작은 스 니펫 코드였습니다. 코드 숨김의 단일 서브 루틴에서 웹 컨트롤의 표시 및/또는 사용 조정을 관리하여 가시성/비 가시성을 설정/해제하는 모든 작업이 일련의 CASE 문 아래에서 발생하도록합니다.'sbSetFormState()'메소드의 실제 실수가있는 코드 스 니펫은 클래스 패널에 'm_eFormState'라는 클래스 변수가 포함되어있어서 업데이트 패널이 실제로 다시 발생하게되어 탭이 순서에 벗어났습니다.

이것은 'fnostro'의 위대한 제안에 의해 잘못된 동작이 노출 될 때까지 기능 기능을 제거하거나 추가하는 것으로 발견되었습니다. 이 주제를 해결 됨/폐쇄로 표시합니다. Fnostro 덕분에 다시 !!!

0

그래서 당신이 말하는 당신의 제어 hierearchy은 다음과 같습니다

UpdatePanel > TGANumeric:GANumeric > UpdatePanel > TextBox 

이것은 단지 내가 다시 게시에 대해 볼 수있는 유일한 이유입니다 쉼표와 숫자의 형식을 오버 헤드가 엄청 많이있다 . 내가 아는 한 서버에서 필요로하는 것이 아무것도 없으므로 게시 할 이유가 무엇입니까?

또는 있습니까?

내 생각은, 업데이트 패널을 잃게 텍스트 상자에 AutoPostBack을 해제, 그것은 바로 볼 수 있어야합니다 경우 형식 클라이언트 측을 처리하거나 게시물 후 저장할 때 위해 DetailsView 필드 DataStringFormat에 서식을 둡니다.

나는 이것이 모든 포커스 문제를 해결할 것이라고 확신합니다.

+0

답장을 보내 주셔서 감사합니다. 예. 계층 구조가 정확합니다. 나는 $$ 또는 수천이 될 수있는 숫자 전용 UC를 만들었고 손실 된 포커스 (텍스트가 변경됨)가 TBox에 포맷 된 번호를 배치하기를 원했습니다. Notice $$는 다음과 같은 값을 가질 수 있습니다. 네거티브에 $ 4.561.23 또는 ($ 1,234.56)이고 날짜 값에 대한 다른 UC가 있습니다. 친숙한 날짜 입력에 대한 코딩이 복잡하기 때문에 서버에서 유효성 검사가 필요합니다. 그래서 자바 스크립트를 블러에 사용한다면, 포커스가있는 숫자가 아닌 문자를 제거해야하며 이는 브라우저에 보낼 많은 코드입니다. 귀하의 의견을 환영합니다. 고마워. –

+0

한 가지 문제는 형식이 지정된 텍스트로 텍스트 상자를 수정하면 이전에 유효성이 검사 된 값을 무효화하는 것입니다. 이것은 문제입니다. HTML5 ASP.NET 4+를 쓰고 있습니까? 그렇다면 TextBox.TextMode를 적절한 * type *으로 설정하면 validity checking clientside를 처리합니다 – fnostro

+0

또한 UC를 사용하여 UC 내에 모든 형식 지정 및 유효성 검사 논리를 갖기를 원했습니다. 또한 값이 목적에 맞을 때만 잃어 버린 포커스에서 숫자 나 날짜를 올바르게 표시하기를 원했습니다 ... 미국 날짜는 45883014는 의미가 없지만 0215는 2015 년 2 월 15 일에 유효합니다 (현재 연도 가정 사용자는 2009 년 3 월 15 일에 mmdd 또는 031509 만 입력하고 초점이 맞춰지면 형식이 지정됨). 시간 내 주셔서 감사 드리며 귀하의 의견은 환영합니다 .... jd –