2008-10-01 5 views
5

몇 가지 webpart가 있다고 가정 해 봅시다. 하나는 컨트롤러로, 다른 하나는 컨트롤러에서 정보를 가져 와서 그에 대한 작업을 수행한다고 가정 해보십시오. ASP 2.0에 도입 된 Consumer/Producer 인터페이스를 사용하여 모델링하는 것이 매우 쉽습니다.Sharepoint WebParts

위의 내용을 유지하면서 상호 작용을 추가 할 수있는 방법은 무엇입니까?

간단한 예는 사용자가 검색을 수행하는 웹 파트 A에 정보를 입력하고 결과가 웹 파트 B에 표시되는 것입니다. Webpart C를 사용하면 webpart A를 트리거하여 쿼리를 다시 제출해야하는 결과를 필터링 할 수 있습니다 따라서 결과를 B로 업데이트하십시오.

WSS 3.0에서는 한 번에 모든 연결에서 하나의 인터페이스 만 사용할 수 있기 때문에 불가능합니다.

이 말이 맞습니까? :-)

답변

2

임의의 제어 통신을 가능하게하는 신속하고 지저분한 해결책은 재귀 찾기 제어 및 이벤트를 사용하는 것입니다. 컨트롤이 필요한 유형의 컨트롤 유형을 통해 컨트롤 트리를 검색 한 다음 게시 컨트롤에서 공개적으로 노출 된 이벤트에 구독하도록합니다.

이전에 특정 통신 API를 완전히 피하기 위해 다른 공급 업체의 CMS 시스템에 포함될 때 표준 서버 컨트롤을 사용하여 서로를 찾을 수있었습니다.

+0

조금 고약하다. D –

1

webpart A에 대한 잘못된 정보가 없으며 public/internal 메서드/속성을 호출하거나 공개/내부 이벤트에 대한 처리기를 구독합니다. 이것을 할 때 한 가지 언급 : EnsureChildControls. 나는 내 눈으로 한 웹 파트가 PreRender로 실행되는 것을 목격했습니다. 다른 웹 파트도 CreateChildControls를 실행하지 않았습니다. 지금 당신은 몇 가지 새로운 데이터를 가져와 같은 일정을 업데이트 등의 작업을 수행 할 수 있습니다

 private Calendar _calendarWP = null; 
    public Calendar CalendarWP 
    { 
     get 
     { 
      if (_calendarWP != null) 
       return _calendarWP; 
      else 
       foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones) 
        foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts) 
         if (webpart is Calendar) 
         { 
          _calendarWP = (Calendar)webpart; 
          _calendarWP.EnsureChildControls(); 
          return _calendarWP; 
         } 
      return null; 
     } 
    } 

:

는 WebPart A에서

,과 같이 (Calendar 형이다이 경우는 WebPart의 B에서) B를는 WebPart하는 참조를 가져 그래서 :

:

  IEnumerable newData = SomeDataProvider.GetNewData(args); 
     CalendarWP.someGridView.DataSource = newData; 
     CalendarWP.someGridView.DataBind(); 

아니면 할 수는 WebPart A는 그 자체에 대한 데이터를 가져 가고 A의 내부/공용 속성는 WebPart 사용할 수 있도록 B를는 WebPart 자체에 대한 참조를 통해 던져