2008-10-01 72 views
5

假設您有幾個Web部件,一個作爲控制器和幾個從控制器獲取信息並對其執行操作的Web部件。使用ASP 2.0中引入的Consumer/Producer接口進行建模非常容易。Sharepoint WebParts

你會如何以其他方式添加互動,同時仍然保持上述狀態?

一個簡單的例子是:用戶輸入信息到webpart A執行搜索,結果將顯示在webpart B上.Webpart C允許你過濾結果,應該觸發webpart A重新提交查詢並因此更新了B中的結果。

在WSS 3.0中似乎不可行,因爲您只允許在任何時間在所有連接中使用1個接口。

這是否有意義? :-)

回答

2

啓用任意控制通信的快速和骯髒的解決方案是使用遞歸查找控件和事件。讓控件按控件類型搜索控件樹,以獲取所需內容,然後在發佈控件上訂閱公開的事件。

我以前使用過這個技巧來使標準服務器控件在嵌入來自不同供應商的CMS系統中時能夠找到彼此,以完全避免特定的通信API。

+0

這有點討厭:D – 2008-10-01 19:48:01

1

我看不出webpart有什麼問題獲取對web部件B的引用並調用public/internal方法/屬性或訂閱處理程序來處理公共/內部事件。當做這件事時提一點:EnsureChildControls。我親眼目睹了一個web界面對PreRender運行清晰,而另一個webpart甚至沒有運行CreateChildControls。

從web部件A,取你參考的WebPart B(在這種情況下的WebPart B是的日曆),像這樣:

 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; 
     } 
    } 

現在你可以做這樣的事情取得一些新的數據和更新,如日曆所以:

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

或許讓web部件折騰到自身的引用到的WebPart B上它可以使用web部件A的公共/內部屬性去爲自己獲取數據:

CalendarWP.UseWPAToFetchData(this);