2012-07-24 2 views
0

부모 페이지 Page1에 button1이 있습니다. Page1에는 uc1이라는 사용자 정의 컨트롤이 있습니다. uc1에는 내부에 격자 grid1이있는 업데이트 패널이 있습니다. uc1.grid1의 행 명령 이벤트 (행 명령 이벤트에 일부 if 조건이 있음)에 따라 Page1.button1의 가시성을 false로 설정하려고합니다. Page1.button1의 가시성을 다음과 같이 설정합니다.상위 페이지 설정 하위 사용자 컨트롤 페이지에서 가시성 제어

uc1에서 IsButton1Visible 속성을 만듭니다. UC1.Grid1.RowCommand의 속성을 page1 PreRender 이벤트에서 false로 설정하고 IsButton1Visible에 액세스하고 Page1.button1 표시를 설정합니다.

Page1.button1 표시 여부가 지정 줄에서 false로 설정되어 있어도 UI가 표시 되어도 여전히 볼 수 있습니다. 내가 뭘 잘못하고 있는지 모르겠다. 또는 button1 및 그 가시성을 잡는 방식이 올바르지 않습니다.

일반적으로 사용자 정의 컨트롤 이벤트 동안 사용자 정의 컨트롤에서 부모 페이지의 컨트롤 속성을 설정할 수 있습니까?

public class ButtonVisiblityEventArgs : EventArgs 
{ 
    public ButtonVisiblityEventArgs(bool visible) 
    { 
     this.Visiblity = visible; 
    } 

    public bool Visiblity { get; private set; } 
} 

public delegate void UpdateParentButtonVisibilityEventHandler(object sender, ButtonVisiblityEventArgs args); 

사용자 제어 코드 : 당신은 이벤트 구동 모델 접근 방식을

위임/EventArgs입니다 코드를 사용하는 경우

+0

귀하의 질문을 등록 더 좋을 수도, 키 오프 조금 혼란 수 있음을 완료합니다. 'IsButton1Visible' 속성이 usercontrol의 일부라는 것을 확신합니까? – freefaller

+1

페이지에서 처리 할 수있는 사용자 지정 이벤트를 UserControl에서 발생시킵니다. 그런 다음 이벤트 인수 또는 UserControl 속성에 따라 가시성을 전환 할 수 있습니다. –

+0

더 나은 접근법은 컨트롤 상에'UpdateParentButtonVisibility' 효과를위한 이벤트를두고 원하는 가시성을 설정하는 이벤트 arg를 생성하는 것입니다. 그런 다음 상위 페이지에서 이벤트를 구독하고 적절하게 처리 할 수 ​​있습니다. –

답변

1

public event UpdateParentButtonVisibilityEventHandler RaiseUpdateParentButtonVisibilityEvent; 

    private void RequestParentButtonVisibilityChange(bool setVisible) 
    { 
     if (RaiseUpdateParentButtonVisibilityEvent != null) 
     { 
      RaiseUpdateParentButtonVisibilityEvent(this, new ButtonVisiblityEventArgs(setVisible)); 
     } 
    } 

그리고 당신의 명령 처리기를, 단지 전화 :

RequestParentButtonVisibilityChange(false); 

버튼을 숨길 때마다. 귀하의 페이지 :

protected void Page_Load(object sender, EventArgs e) 
    { 
     this.RaiseUpdateParentButtonVisibilityEvent += new UpdateParentButtonVisibilityEventHandler(uc_RaiseUpdatecurrentDisplayPanelRequestEvent); 
    } 

    private void uc_RaiseUpdatecurrentDisplayPanelRequestEvent(object sender, ButtonVisiblityEventArgs args) 
    { 
     button1.Visible = args.Visiblity; 
    } 
+0

답변 해 주셔서 감사합니다. 사용자 컨트롤의 업데이트 패널 안에있는 그리드 컨트롤에서 이벤트가 발생하는 경우에 작동하는지 알고 싶습니다. – SARAVAN

+0

그리드가 업데이트 패널에 있고 업데이트 할 버튼이 외부에있는 경우이 대답은 작동하지 않습니다. 업데이트 패널 이 경우에 또 다른 대답을 제공했습니다. –

+0

이 대답을 통해 업데이트 패널이 어떻게 작동하는지 생각하게되었습니다. 위의 대답에서 제안 된 아이디어를 사용하고 있습니다. 도와 줘서 고마워. – SARAVAN

0

문제는 귀하의 버튼이 업데이트 패널 외부에 있다는 것이므로 다음을 수행 할 수 있습니다. 페이지 codebhind :

protected void Page_Load(object sender, EventArgs e) 
    { 
     string hideScript = string.Format("function updateButtonVisibility(visibility) {{ var button = $('#{0}'); if (visibility) {{ button.show(); }} else {{ button.hide(); }} }}", this.button1.ClientID); 

     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "updateButtonVisibility", hideScript, true); 

    } 

그리고 사용자 제어 명령 처리기

:

bool shouldButtonBeVisible = false; //update this appropriately in your logic 
    ScriptManager.RegisterStartupScript(this, this.GetType(), "upUpdateButtonVisibility", "updateButtonVisibility(" + shouldButtonBeVisible ? "true" : "false" + ");", true); 

이 당신의 UC와 페이지 사이에 꽉 의존성을 만들고 있습니다. 이 컨트롤을 사용하는 페이지가이 스크립트를 등록해야합니다. 이 문제를 해결할 수있는 방법이 있습니다 (예 : 호출 할 함수 스크립트 콜백 설정, 자바 스크립트 함수가 있는지 확인하는 등).하지만 적어도 이동해야합니다.

하여 업데이트 패널 후 페이지에 대한 구체적인 뭔가가 있다면 당신이 그것을 끝 요청 핸들러에게

$(function() { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(updatePanelEndRequestHandler); }); 

function updatePanelEndRequestHandler() { 
    var shouldBeVisible = $('.MyClassThatSaysIShouldntAllowMoreButtons').length > 0; //do some checking on the grid 
    updateButtonVisibility(shouldBeVisible); 
} 
관련 문제