WalkThrough SharePoint WebPart 入门指南 五 blog.joycode.com Kaneboy [MS MVP] 转载声明:此WalkThrough系列被转载和引用时,请保持博客堂链接。 Thanks.
此WalkThrough将演示 在两个WebPart之间交换数据(Connectable WebPart)
背景知识 了解WebPart编程的一般知识,请阅读此WalkThrough系列的前4辑。此WalkThrough中将不对某些具体细节(部署等)做详细描述。
一、了解Connectable WebPart Provider WebPart Consumer WebPart 提供者可以向使用者提供: 一项数据(Cell) 一行数据(Row) 一个表的数据(List) 查询过滤器(Filter) 参数(Parameters) ICellProvider IRowProvider IListProvider IFilterProvider IParametersInProvider IParametersOutProvider ICellConsumer IRowConsumer IListConsumer IFilterConsumer IParametersInConsumer IParametersOutConsumer 这个WebPart做为数据提供者 这个WebPart做为数据使用者 ★ Provider WebPart至少需要实现一个Provider接口 ★ Consumer WebPart至少需要实现一个Consumer接口 ★ Provider接口和Consumer接口(通过Transformer)不一定要一一对应 ★ 位于不同页面的符合要求的WebPart也可以连接起来
二、创建Provider WebPart(一) 在VS.NET中建立一个类型为“Web Part Library”,名称为“SampleWebPart”的项目。 将VS.NET自动创建的WebPart1( WebPart1.cs、 WebPart1.dwp)删除。 如左图,新建一个“Provider Web Part”,名称为“CityProvider”
三、创建Provider WebPart(二) 如下图所示,VS.NET自动生成的CityProvider不但从Microsoft.SharePoint.WebPartPages.WebPart继承,还实现了ICellProvider接口。实现了ICellPrivider的WebPart可以提供给别的WebPart一项数据。 在自动生成的“EnsureInterfaces()”方法中,可以看到有一条调用“RegisterInterface()”方法(包含8个参数)的语句,将其更改为: RegisterInterface ("CellProvider_WPQ_", "ICellProvider", WebPart.UnlimitedConnections, ConnectionRunAt.Server, this, "CellProviderInterface_WPQ_", “提供一个城市名称给:", “提供一项包含了城市名称的数据");
四、创建Provider WebPart(三) 在CityProvider中定义一个下拉框控件: private DropDownList cityList = new DropDownList(); 重写基类的“OnLoad()”方法,给下拉框绑定一些数据: protected override void OnLoad(EventArgs e) { if (cityList.Items.Count == 0) cityList.DataSource = new String[] {“北京”, “上海”, “深圳"}; cityList.DataBind(); } this.Controls.Add( cityList ); cityList.AutoPostBack = true; } 在已有的“RenderWebPart()”方法中,输出这个下拉框控件的内容: protected override void RenderWebPart(HtmlTextWriter output) cityList.RenderControl(output);
五、创建Provider WebPart(四) 在已有的“PartCommunicationMain()”方法中添加下面的代码,将开始添加的下拉框控件中选中的项的数据传递出去。 public override void PartCommunicationMain() { if (CellReady != null) // 创建要传递出去的数据 CellReadyEventArgs cellReadyArgs = new CellReadyEventArgs(); cellReadyArgs.Cell = cityList.SelectedItem.Text; // 通过CellReady这个事件,将数据传递给使用者 CellReady( this, cellReadyArgs ); }
六、创建Consumer WebPart(一) 如左图,新建一个“Consumer Web Part”,名称为“CityConsumer”
七、创建Consumer WebPart(二) 如下图所示,VS.NET自动生成的CityConsumer不但从Microsoft.SharePoint.WebPartPages.WebPart继承,还实现了ICellConsumer接口。实现了ICellConsumer的WebPart可以从别的WebPart接收一项数据。 在自动生成的“EnsureInterfaces()”方法中,可以看到有一条调用“RegisterInterface()”方法(包含8个参数)的语句,将其更改为: RegisterInterface ("CellConsumer_WPQ_", "ICellConsumer", WebPart. LimitOneConnection, ConnectionRunAt.Server, this, "CellConsumer_WPQ_", "从...处接收一个城市名称", "获取一项包含了城市名称的数据");
八、创建Consumer WebPart(三) 在已有的“CellReader()”方法中,接收Provider WebPart传送过来的数据,并赋值给自动生成的Text属性: public void CellReady(object sender, CellReadyEventArgs cellReadyArgs) { if(cellReadyArgs.Cell != null) Text = "你选择的是:" + cellReadyArgs.Cell.ToString(); } } 这个“CellReady()”方法会被SharePoint自动注册到(被连接起来的)Provider WebPart的CellReady事件,参看第五步骤。这样Provider WebPart就可以将数据通过CellReady事件传过来。 在自动生成的这个CityConsumer中,VS.NET会自动添加一个Text属性,并把Text属性的值在“RenderWebPart()”方法中输出。所以我们这个演示无需手写更多代码。
九、为两个WebPart创建部署文件 如右图,在项目中增加两个Dwp部署文件,分别命名为“CityProvider.dwp”和“CityConsumer.dwp”。下面分别是这两个Dwp文件的内容: <?xml version="1.0" encoding="utf-8"?> <WebPart xmlns="http://schemas.microsoft.com/WebPart/v2" > <Title>CityProvider</Title> <Description>一个提供城市名称的WebPart</Description> <Assembly>SampleWebPart</Assembly> <TypeName>SampleWebPart.CityProvider</TypeName> </WebPart> <?xml version="1.0" encoding="utf-8"?> <Title>CityConsumer</Title> <Description>一个接收城市名称的WebPart</Description> <TypeName>SampleWebPart.CityConsumer</TypeName> </WebPart>
十、部署、连接两个WebPart 将两个WebPart部署到一个页面上,如左图。由于我们尚未将它们连接起来,它们之间不会有任何数据的交互。 点击页面右上角的“修改我的网页”,选择“设计此网页”,进入当前页面的编辑状态。 如上图,点击CityProvider WebPart右上方的菜单按钮,选择“连接、提供一个城市名称给:、CityConsumer”,将这两个WebPart连接了起来。 同样,也可以点击CityConsumer WebPart右上角的菜单按钮,选择“连接、从…处接收一个城市名称、CityProvider”,来进行连接的操作。两者做其一即可。
十一、连接WebPart的效果 如左图,将两个WebPart连接起来以后,CityConsumer就可以接收到CityProvider选中的城市的名称,来动态的输出接收到的数据。 从CityProvider的下拉框中选择“上海”这个选项。 可以看到CityConsumer根据接收到的新的数据更改了输出内容。
十二、To Be Continued… blog.joycode.com Kaneboy [MS MVP]