2010-12-10 2 views
0

내가 가진 UserControl을 A가 처음로드 될 필요하고 로딩이 완료된 후, 나는 모두를 추가하는 것을 선호 UserControl이 B.로드 - ASP.NET 웹폼이

를로드 할 필요 이러한 사용자는 컴파일 타임에 페이지를 제어합니다 (가능한 경우 동적로드를 방지하려고합니다).

  • 컴파일시 페이지에 사용자 정의 컨트롤을 추가하고 사용자 컨트롤 B에 대해 false로 표시하면 여전히 B 코드가 실행됩니까? 그런 다음 사용자 정의 컨트롤 A를로드 한 후 가시성을 true로 설정할 수 있습니다.
  • 사용자 정의 컨트롤 A의로드 완료를 알리는 이벤트/위임자를 사용해야합니까?
+2

컨트롤 B를로드하기 전에 컨트롤 A를로드해야하는 이유는 무엇입니까? UserControls는 중첩 컨트롤이나 복합 컨트롤이 아니면 다른 UserControls와 상호 작용하도록 디자인되어서는 안됩니다. 당신은 당신의 디자인을 더 설명 할 수 있습니까? –

답변

2

컨트롤 b의 모든 이벤트를로드하지 말고 컨트롤 b의 메서드를 호출하면됩니다. 그런 다음 이벤트를 추가하여 페이지가 소비하는 것을 제어하고, 이벤트가 발생하면 컨트롤의 load 메소드를 호출합니다. b.

편집 : 좋아

에 SampleCode

예를 들면 있도록하는 ASPX 페이지

  • 만들
  • 배 사용자가 영문 페이지에 모두 사용자 컨트롤을 넣어

제어합니다.

<cc:control1 runat="server" id="control_one" /> 
    <cc:control2 runat="server" id="control_two" /> 

그럼 컨트롤 1에서 대리자와 이벤트를 생성한다.

public delegate void MyCustomEvent (EventArgs args); 
    public event MyCustomEvent MyEvent; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     MyEvent(e); 
    } 

페이지로드시 이벤트가 발생했습니다. 따라서 필요한 경우, 완료되면 MyEvent 이벤트를 호출하여 로직을 생성 할 수 있습니다.

페이지에서 해당 이벤트에 대한 처리기를 추가하려는 경우 호출 할 때 함께 처리 할 수 ​​있습니다.

protected override void OnInit(EventArgs e) 
    { 
     control_one.MyEvent += new WebUserControl1.MyCustomEvent(control_one_MyEvent); 
     base.OnInit(e); 
    } 

    void control_one_MyEvent(EventArgs args) 
    { 
     control_two.MyCustomLoad(); 
    } 

그래서 페이지가 초기화 될 때 이벤트 처리기를 추가합니다. 이벤트 처리기에서 물건을로드하려면 두 번째 컨트롤에서 사용자 지정 메서드를 호출합니다. ,

public void MyCustomLoad() 
    { 
     //Stuff only loaded when event is raised and calls this method. 
    } 

그래서이 뭔가를로드 제어 1을 수있는 페이지가, 그것은 뭔가를 컨트롤이 말할 수 끝났어 알고 때이 끝났다 말 :

그런 다음 두 번째 컨트롤에 내가있다.

편집 :이 문제를 친구와 논의한 후 주문 제어를 설명하겠다.

페이지 수명주기 이벤트의 순서를 제어 할 수 없습니다. 즉, 컨트롤 A를 가질 수 없으며 모든 페이지 라이프 사이클 이벤트를 실행 한 다음 완료되면 컨트롤 B가 페이지 라이프 사이클 이벤트를 모두 실행하도록하십시오.

페이지 수명주기를 없애고, 위 예제에서와 같이 컨트롤을 렌더링하는 순서를 제어하는 ​​방법을 만들 수 있습니다. 제어 A가 끝날 때 특정 지점에서 이벤트를 발생시킴으로써 제어 B에게 무엇인가를 지시 할 수 있습니다.

두 컨트롤 사이의 중간은 컨트롤 A에서 발생하는 이벤트를 처리하는 페이지로, 컨트롤 B의 메서드를 호출합니다. (잘 해킹 할 수 있습니다.)은 컨트롤 A를 구체적으로 말할 수 없습니다. 컨트롤 B는 나쁜 두 컨트롤간에 직접적인 종속성을 만들기 때문에 무언가를 할 수 있습니다. 것 (

+0

이벤트를 추가하는 방법과 컨트롤 A가로드를 완료 할 때 이벤트를 발생시키는 방법에 대해 좀 더 설명 할 수 있습니까? ControlA의 페이지로드에 있어야합니까? – Nick

+0

@RSharma 답변을 업데이트했습니다. – Phill

1

이것은 치명적인 디자인입니다. 컨트롤이로드되는 순서는 중요하지 않도록 UI를 디자인해야합니다. 컨트롤로드 순서는 사용자 컨트롤의 범위를 벗어납니다.


은 주문/Orderlines 제어 쌍 "필의"문제를 해결하려면

나는 그 자체로 유용하기 때문에 주문 컨트롤이 개발되었다고 가정합니다. OrderLines는 Order 컨트롤에 표시된 특정 주문의 광고 항목을 표시 할 수 있도록 개발 된 것으로 가정합니다.

나는 Order와 OrderLines를 결합한 하나의 복합 컨트롤이 있어야한다고 주장했다. 이 컨트롤은 표시 할 광고 항목으로 구성된 DataSource 인 OrderLines 컨트롤로 전달됩니다. 이로 인해 OrderLines는 다른 컨트롤과 독립적입니다. 단순히 표시 할 데이터 만 표시합니다. 그 데이터가 어디에서 왔는지는 알 수 없습니다.

일반적인 모눈/상세/상세 선 시나리오로 확장 할 수 있습니다.이 시나리오에서는 모눈 세트를 주문에 전달합니다. 선택하면 특정 그리드 행이 Order 컨트롤을 통과하여 선택된 순서를 전달합니다. 이제는 광고 항목을 표시 할 시간이되면 OrderLines 컨트롤 등에 현재 광고 주문의 광고 항목 컬렉션을 전달하십시오.

이렇게하면 각 컨트롤은 아무 것도 할 필요가 없으며 책임있는 단일 작업이됩니다.

+2

컨트롤이 다른 컨트롤에 종속 될 수없는 이유는 없습니다. – Phill

+0

예, 이벤트 발생 순서에 의존하지 않는 이유가 있습니다. 컨트롤이 이벤트의 순서에 의존 할 수없는 경우에도 서로 "의존"할 수 있다면 괜찮습니다. 그러나 주문에 의존하거나 완전히 예측할 수는 없습니다. –

+0

당신은 단지 절차 코드가 될 수 있습니다. 당신은 페이지 이벤트에 의존하지 않고, 당신은 자신의 이벤트를 1 개씩 털어 놓습니다. – Phill

1
  • 예, 코드 뒤에 여전히
  • 이벤트가 도움이 될 수있는 실행됩니다

하지만 당신의 컨트롤이 서로 특정 의존성이있는 경우, 어쩌면 그들은 단지 하나의 제어해야?

0

는 "내가 가진 UserControl을 A가 처음로드 될 필요하고 로딩이 완료된 후, 나는 컴파일시 페이지에서 이러한 사용자 컨트롤을 모두 추가하는 것을 선호 UserControl이 B.

를로드 할 필요 .

http://webformsmvp.com/ http://wiki.webformsmvp.com/index.php?title=Main_Page

뿐만 아니라 좋은 내가되는 -을 : 동적 로딩 가능한 경우)을 피하기 위해 같은 "

을 나는 WebFormsMVP를 사용하는 것이 좋습니다 것입니다 이 프레임 워크의 가장 유용한 기능 중 하나 인 Model-View-Presenter의 구현은 메시징에 대한 지원입니다.

요약하면, 메시지 유형을 만들고 usercontrols (보기)는 필요한 유형의 메시지를 메시지 버스에 게시 할 수 있습니다. 다른 컨트롤은 특정 유형의 메시지를 구독 할 수 있으며 WebFormsMVP 프레임 워크는 메시지가 전달되도록합니다.

게시자가 & 게시글을 통해 사용자 정의 컨트롤 간의 상호 작용을 처리 할 수 ​​있도록 허용합니다. 구독 순서는 걱정하지 않아도됩니다.

유일하게 다른 옵션은 ASP.NET이 컨트롤을 컨테이너로로드하는 순서에 의존 할 수 없기 때문에 동적 컨트롤로드를 사용하는 것입니다.