文章。现在,通过用作为AggregateDataSource链接数据源和SharePoint Designer这将是很容易做到这一点。但是一旦子网站变化,你将不得不在SPD里重新标记数据源或是纯手动地。 v3t<rv
现在,有人会说,你可以使用跨站点SPDataSource做到这一点,等等,他们当然是对的。有得到的最终结果更简单的方法,但本文的目的是为了向你展示如何修改组件运行时。如果你想作一个简单的聚集,使用内容查询Web部件,一个跨站点SPDataSource甚至RSS。如果你想学习组件运行时修改,继续住下阅读。 SAf)#HXa
只为了确保你理解我们的立场,我将解释AggregateDataSource以及在SPD如何创建一个链接的数据源。即使您知道如何做到这一点,请按照示例以便您了解我们面临的问题时,我们有一个动态的网站结构和的理解我们正在努力地聚集的网站结构。 WS.g`%
首先,我们首先假设下面的网站结构: hgE:2@
xw_$1
S
现在,在每一个子网站中,我们有个自定义列表名为"文章"包含至少'Title'和'Pri'列表栏。我们需要有一个Web部件聚集所有的文章的所有标题,基于"pri"字段排序。 @]}/vsI m
如果网站结构是静态的,你可以通过使用一种称为链接数据源来完成。启动SPD来创建一个,转到数据源库窗格。在最底部,点击"链接到其他库…",然后,对于结构中每个子网站,单击添加,然后输入一个名称和子网站的位置。 9xw"NcL
>t'A1`W
如果你再看看数据源库,你会发现其中提供给你的数据源,烟囱加箍、加固,你现在可以使用所有你输入的地址的子网站的列表。你可以添加任何一个Web部件列表或数据源到页面。但是,我们希望从数个列表里聚集所有文章,为此,我们需要一个链接数据源。 V:P]Ved
展开链接源节点,然后单击"新建链接源...",然后按[配置链接源...]。对于之前添加的每个子网站,双击添加文章列表到'选择的数据源'列表框,然后单击[下一步]。 T;{:a-8
}|[0FP]v
在接下来的页面上,请确保您选择'合并'选项,然后单击完成。 如果你喜欢,请在常规选项卡,并添加一个名称,描述和此数据源的关键字。 完成后,单击确定。 :
)B1|1
一旦你创建了新数据源,你就能拖拽新数据源到一个页面来创建一个合并后的文章的DataFormWebPart (DFWP)。你可以操作该DFWP就像你操作任何一个其他单列表数据源DFWP。设置格式,添加或删除字段,应用布局排版,做你想做的。 0YfmAF$/ B
i1KjQ1\a +
这在已预定义或列表很少变化的的静态网站结构中很有效,脱硫玻璃鳞片。但是,如果您选择添加,编辑或移除子网站包含你想要的信息汇总,你需要修改你的数据源,砖烟囱新建。 gae=+@z
现在,如果你观察在SharePoint Designer在代码视图的Web部件,其实你将看到你所添加的实际为一个普通的DataFormWebPart 包含一个DataSourece子节点,绿色的标记,包括一个AggregateDataSource。这些标记,只是.Net 类里展现为标签内容的很普通的标签。我们可以很容易操纵标签的内容,因而,使用自定义代码的类的行为。这就是我们如何能创建一个动态的AggregateDataSource。 @W$ha
y
第一件事首先,我们需要一个将操纵DataFormWebPart的数据源。创建一个新的ASPX页面,给它个名字(我的叫MyTestPage.aspx),然后拖拽你新创建的链接源在SPD设计视图中。如上所述任意布局排版或做其他任何。 gV\Y>y4v
现在,你可能会问:如果我要编写代码来操作数据源,为什么不直接写代码来创建整个DataFormWebPart? 很棒的问题,我很高兴你这样问。 F9%+7Op^
简短的回答是:这样比较简易。 !T
,=kh
详细的回答是:嗯,如果你这样做,你要么需要继承或具有创建自定义的DataFormWebPart的能力。通过使用已经存在DFWP你可以格式化,排版和操作,使用内置的设计功能,唯一考虑的是显示什么数据,而不是怎么样。 设计者会爱上你这点;他们现在能极兴奋(go babanas)地漂亮做事,而你可以拖你自定义的组件到页面某处然更改要显示的数据。良好的开发实践使表现从数据中分离出来。 2$!,$J-<Y
让我们继续我们的代码怎么样 _zzNF93Bn
从创建一个简单的自定义组件开始。如果你之前未曾做过,我已经写了一篇文章将引导你分步地创建自定义组件,位于http://furuknap.blogspot.com/2008/05/creating-your -own-custom-components-for.html。然而,这个例子中,不重写RenderContents方法,而是于OnLoad方法。如果你不希望写所有的代码,我附带了一个Visual Studio 2005 Q2woCxB
的解决方案"Begin",可以在文章的未尾看到。现在就去,然后回来。我会在这里等你。 =OPX9oG
重载OnLoad,确保当我们加载该组件时可以访问DFWP的数据源。OnLoad事件发生在DataBinding事件之前,因此,我们确保在OnLoad中改变数据源是正确的设置数据源的时间。这一点很重要,一旦数据绑定方法已经执行就再没有办法去操纵他们,一直到结果显示出来。 ~EXCYUp4v
既然我们要操作一个现有的DataFormWebPart控件, 我们需要一些方法去识别和访问这个控件。我们还需要一些途径知道哪些列表需要聚集。让我们解决这些问题通过添加一些属性到这个控件,添加以下行到你的类: cT/mi":8{
S'ms>ZENC
17privatestring m_DataFormWebPartId; ?P>4H0@I+
18 2P@6Qe
?
19 publicstring DataFormWebPartId CAom4Sp'
20{ @o'L! 5Y
21get { return m_DataFormWebPartId; } %VR{<{3f
22set { m_DataFormWebPartId = value; } (0`w.n
23} Yjd/
24 hm0A%Js
25privatestring m_ListName; )flm3G2u
26 jA^Dk$
27publicstring ListName OU#p^5K
28 { 8tna<Hx
29get { return m_ListName; } Wc!]X.|9*
30set { m_ListName = value; } R)*l)bpZ#
31 } m8R=wb
:
这样做可以让我们在设计的时候配置这个组件。公有属性被用作asp.net 标签的一部分,对于实例:<MyTags:DynamicAggregateDataSource DataFormWebPartId ="MyDFWPId" ListName ="Articles" runat="server"/> } snS~kx
现在我们有一个标识DFWP和聚集的列表名称,需要获得访问DFWP数据源的方式。然后我们可以开始操纵数据源。添加以下代码到OnLoad方法: t?Qbi)T=z
m}oR*<.
35DataFormWebPart m_dfwp =this.Page.FindControl(DataFormWebPartId) as DataFormWebPart; _FcTY5."S
36 2 @T~VRy
37m_dfwp.DataSources.Clear(); // Empty datasources @
V5i
38 S+-$Ih`[
39AggregateDataSource ads =new AggregateDataSource(); W+U0Y,N6
40 int sourceCounter =0; ^q&|7Ou-
41SPWeb web = SPContext.Current.Web; t)?K@{ 9
42StringBuilder aggregateString =new StringBuilder(); FeO1%#2<y
43 &y