Sharepoint WebParts
时间:2020-03-06 14:58:34 来源:igfitidea点击:
假设我们有多个Web部件,一个Web部件作为一个控制器,还有几个Web部件从该控制器获取信息并对其执行操作。使用ASP 2.0中引入的Consumer / Producer接口可以很容易地对其进行建模。
在保持上述内容的同时,我们如何能够以其他方式添加交互?
一个简单的示例是:用户将信息输入到Webpart A中进行搜索,结果将显示在Webpart B上。WebpartC允许我们过滤结果,这将触发Webpart A重新提交查询并因此更新结果为B。
在WSS 3.0中似乎无法执行此操作,因为我们一次只能在所有连接中使用1个接口。
这有道理吗? :-)
解决方案
启用任意控件通信的快速而肮脏的解决方案是使用递归查找控件和事件。让控件按控件类型在控件树中搜索所需的内容,然后订阅发布控件上公开显示的事件。
以前,我曾使用过这种技巧来使标准服务器控件在嵌入到不同供应商的CMS系统中时能够相互查找,从而完全避免使用特定的通信API。
我没有看到Webpart A引用Webpart B并调用公共/内部方法/属性或者将处理程序订阅到公共/内部事件,这没什么错。但是,在执行此操作时要提及的一点是:surechildcontrols。我亲眼目睹了一个Web部件可以在PreRender上运行,而另一个Web部件甚至都没有运行CreateChildControls。
从Web部件A中获取对Web部件B的引用(在这种情况下,Web部件B为Calendar类型),如下所示:
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();
或者,也许让Webpart A将对自身的引用扔给Webpart B,以便它可以使用Webpart A的公共/内部属性为其自身获取数据:
CalendarWP.UseWPAToFetchData(this);