2008-10-01 73 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);