2017-01-22 9 views
0

ASP 페이지에 붙어 있습니다.DataBound ASP : CheckBox 이벤트가 예상대로 트리거되지 않음 Page_Load()에서 발생하는 DataBinding의 bacause

페이지에 여러 개의 확인란이 포함 된 ASP : 컨테이너가 있습니다. 이러한 CheckBoxes OnCheckChange에 이벤트를 추가해야하므로 CheckBox 중 하나를 클릭 할 때마다 다른 모든 확인란의 선택이 취소됩니다. RadioButton을 사용할 수 있지만 CheckBox를 사용하는 것은이 주제를 벗어나는 다른 장점이 있으므로 라디오 버튼을 사용하고 싶지는 않습니다.

<ASP:Repeater id="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound"> 
    <ItemTemplate> 
     <asp:CheckBox id="MyCB" runat="server" OnCheckedChanged="MyCB_CheckedChanged" AutoPostBack="true" /> 
     <br/> 
    </ItemTemplate> 

    </ASP:Repeater> 

을 뒤에 코드로 :한다면 이론적 그냥 같이 잘 작동 할 것입니다

예상대로이 페이지의 다른 지역을 가지고, 그러나

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 


    protected void MyCB_CheckedChanged(object sender, EventArgs e) 
    { 
     UncheckallOtherCheckBoxes(); 
    } 

이 일을 내가해야 할 처음 페이지가로드 될 때마다뿐만 아니라 모든 페이지로드시 DataSource를 바인딩합니다. 그래서 나는

protected void Page_Load(object sender, EventArgs e) 
    { 
    // if (!IsPostBack) 
     { 
      MyRepeater.DataSource=DS; 
      MyRepeater.DataBind(); 
     } 
    } 

로를 Page_Load을 변경해야합니다 그리고 이것은 실패의 모든 원인! :) 체크 상자를 클릭하면 MyCB_CheckedChanged() 전에 Page_Load가 트리거되기 때문에. DataBinds 먼저 DataBinding은 사용자가 수행하지 않은 체크 박스 이벤트를 보냅니다.

이 문제를 해결할 방법이 있습니까?

Thx.

+0

1. 페이지가로드 될 때마다 데이터베이스를 리 바인드해야합니까? 조금 이상합니다. 이유를 설명해 주면 다른 사람들이 더 잘 이해할 수 있습니다. –

+0

@Sandy : 포즈에 언급 된 컨테이너가 다른 컨테이너에 중첩되어 있기 때문에 생각합니다. 포스트 백에서 마스터 컨테이너를 다시 바인드하지 않으면 모든 하위 컨테이너에 데이터가 없음을 알게됩니다. –

답변

0

가능한 경우 나중에 페이지 수명주기에서 데이터 소스를 바인딩 해보십시오 (예 : onPreRender). 체크 박스의 컨트롤 이벤트는 PageLoad 이후, PreRender 및 일부 다른 이벤트 전에 처리됩니다. 자세한 내용은 https://msdn.microsoft.com/en-us/library/ms178472.aspx을 참조하십시오.

+0

컨테이너가 다른 컨테이너에 중첩되어 있음을 언급해야합니다. 이것이 PostBack에 표시 될 체크 박스에 대해 리바운드되어야하는 아버지 컨테이너입니다. 내 바인딩을 PreRender로 이동하는 경우와 동일한 결과가 발생합니다. 데이터 소스가 재설정 된 내 아버지 컨테이너를 리 바인드하지 않으면 자식 컨테이너가 없으므로 MyCB_CheckedChanged 메소드가 트리거되지 않습니다. 상자를 선택하면 PostBack = false, 에만 바인딩하면 페이지가 다시로드되고 아버지 컨테이너는 리 바인드되지 않으며 하위 항목이 없습니다. 모든 체크 박스가 사라지고 다시 MyCB_CheckedChanged 이벤트가 트리거되지 않습니다 ... –

+0

Page의 PreRender 이벤트 외에도 대부분의 개별 컨테이너에도 PreRender 이벤트가 있습니다. 부모 컨테이너를 자체 PreRender 이벤트로 리바 인딩하려고 시도했지만, PreRender 이벤트에서 자식 컨테이너를 개별적으로 리 바인드했습니다. 이 방법으로, 하위 컨테이너는 당신이 원하는 최신 부모를보고 있어야합니다. –

+0

또한 문제를 설명하기 위해 간단한 소스 코드 예제를 게시 한 경우 유용 할 것입니다. 남은 사람들이 자신이하는 일을 더 잘 이해하는 것이 도움이됩니다. :) –