MOSS中WebPart开发简介

    技术2026-08-23  21

    MOSS中WebPart开发简介

     

    概述 WebPart生命周期.

    当一个包含WebPart的WSS站点页面被响应请求或者是它被提交到Server端的时候,这时WebPart生存周期开始了

    OnInit 初始化,加载相关配置文件 (如WebPart任务面板上的属性,样式等配置信息) . LoadViewState 返回先前最后一次被处理的状态 (如webpart是展现,隐藏还是关闭) CreateChildControls 创建WebPart UI ,通过Controls.Add()方法装载Web 控件 (Note:当Webpart是第一次展现的时候CreateChildControls方法发生在OnLoad方法之前,而经过一次postback之后,它发生在OnLoad方法之后) OnLoad 从数据库或者其他系统重新获取要展现的数据 (如获取数据库连接) User-Generated Events 响应用户生成事件 (如Button Click) RendenContents 生成 html output,实现最终的UI展现 (由HTMLTextWriter class 来实现) SaveViewState 保存控件状态 (ViewState 被序列化之后保存在一个hidden field 里) Dispose 从内存中移除对象,释放临界资源 (如释放数据库连接) OnUnLoad 最终完成内存清除工作 WebPart 关联 方法一: 一个WebPart的事件处理程序,把要传递的信息赋给别一个WebPart的属性,接收信息的WebPart通过此属性值来处理呈现.这二个WebPart必须在同一个页面上都要添加. 方法二: MOSS提供了一种专门的机制Web Part Connection,用于在WP之间传递数据.

    SharePoint将要进行数据传递的WP分为两类:

    Provider WP: 提供数据

    Consumer WP: 接收数据

    Web Part Connection 机制提供了一种松耦合的数据连接机制。Provider WP 和 Consumer WP都只用关心自己的实现即可,而不必关心数据的接收或提供者是谁,怎么去使用。

    在部署之后,我们的页面上放置了Provider WP and Consumer WP, 这时候SharePoint机制会自动检测页面上所有Web Part 的类型,用数据通道把这俩种Web Part挂接起来,。如果发现某个Provider WP 所提供的数据正好可以被另外一个Consumer WP使用,那么管理员就可以在页面上直接将它们俩个连接起来。一个Provider WP 可被多个Consumer WP使用。通过数据通道,这样也就实现了Provider 和Consumer 之间的数据传递 。

    开发步骤 首先用vs2008创建GetListWebPart的Class Library工程,右击工程属性为工程添加强名,打开工程的AssemblyInfo.cs文件添加 " using System.Security;" 命名空间与 "[assembly: AllowPartiallyTrustedCallers()]" 二行,为工程添加Microsoft.SharePoint和System.Web的引用. 添加文件ListWebPart的代码文件(也就是webpart一,主要用下拉列表列出二个LIST中的ITEM的TITLE),代码如下:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using Microsoft.SharePoint;

    namespace GetListWebPart

    {

    public class ListWebPart:WebPart

    {

    protected DropDownList drpdownlist1;

    protected DropDownList drpdownlist2;

     

    public ListWebPart()

    {

    this.ExportMode = WebPartExportMode.All;

    }

    protected override void CreateChildControls()

    {

    drpdownlist1 = new DropDownList();

    drpdownlist1.ID = "list1";

    drpdownlist1.AutoPostBack = true;

    drpdownlist1.DataSource = GetListItem("test1 list");

    drpdownlist1.DataTextField = "Title";

    drpdownlist1.DataValueField = "ID";

    drpdownlist1.DataBind();

    drpdownlist1.SelectedIndexChanged += new EventHandler(drpdownlist1SelectedIndexChanged);

    this.Controls.Add(drpdownlist1);

     

    drpdownlist2 = new DropDownList();

    drpdownlist2.ID = "list2";

    drpdownlist2.AutoPostBack = true;

    drpdownlist2.SelectedIndexChanged += new EventHandler(drpdownlist2_SelectedIndexChanged);

    drpdownlist2.DataSource = GetListItem("test2 list");

    drpdownlist2.DataTextField = "Title";

    drpdownlist2.DataValueField = "ID";

    drpdownlist2.DataBind();

    this.Controls.Add(drpdownlist2);

    ChildControlsCreated = true;

    //base.CreateChildControls();

    }

     

    protected override void Render(HtmlTextWriter writer)

    {

    writer.Write("<table border='1' align='center' cellpadding='2' cellspacing='0' borderColor='gray' width='80%'>");

    writer.Write("<tr><td colspan='2' align='center'>Weldon MOSS WebPart</td></tr>");

    writer.Write("<tr><td align='center' > test1 list title:");

    drpdownlist1.RenderControl(writer);

    writer.Write("</td><td align='center'> test2 list title:");

    drpdownlist2.RenderControl(writer);

    writer.Write("</td></tr></table>");

    //base.Render(writer);

    }

     

    void drpdownlist2_SelectedIndexChanged(object sender, EventArgs e)

    {

    //drpdownlist1.Items.Clear();

    }

     

    protected SPListItemCollection GetListItem(string listName)

    {

    //SPSite site = new SPSite("http://www.qsh.com:81/Docs/default.aspx");

    SPSite site = SPContext.Current.Site;

    SPWeb web = site.OpenWeb("Docs");

     

    SPList list = web.Lists[listName];

    SPListItemCollection items = list.Items;

    return items;

     

    }

     

    void drpdownlist1SelectedIndexChanged(object sender, EventArgs e)

    {

    for (int i=0; i < WebPartManager.WebParts.Count; i++)

    {

    if (WebPartManager.WebParts[i].Title == "ListItemWebPart")

    {

    ListItemWebPart item = (ListItemWebPart)WebPartManager.WebParts[i];

     

    SPSite site = SPContext.Current.Site;

    SPWeb web = site.OpenWeb("Docs");

     

    SPList list = web.Lists["test1 list"];

    item.item = list.Items.GetItemById(Convert.ToInt32(drpdownlist1.SelectedValue));

    }

    }

    }

    }

    }

     

    添加ListItemWebPart的代码文件(WEBPART 二,当WEBPRTE 一的下拉选项变化时,负责呈现ITEM的具体信息)代码如下:

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using Microsoft.SharePoint;

    namespace GetListWebPart

    {

    public class ListItemWebPart:WebPart

    {

    public ListItemWebPart()

    {

    this.ExportMode = WebPartExportMode.All;

    }

    private SPListItem _item = null;

    public SPListItem item

    {

    set { _item = value; }

    get { return _item; }

    }

     

    protected override void Render(HtmlTextWriter writer)

    {

    writer.Write("<table border='1' align='center' cellpadding='2' cellspacing='0' borderColor='gray' width='80%'>");

    writer.Write("<tr><td colspan='100' align='center'>List Item Detail</td></tr>");

    writer.Write("<tr>");

    if (item == null)

    writer.Write("<td>Please Select List Item in webpart</td>");

    else

    {

    writer.Write("<td>" + item["Title"] + "</td>");

    writer.Write("<td>" + item["DropList1"] + "</td>");

    writer.Write("<td>" + item["drp2"] + "</td>");

    writer.Write("<td>" + item["Created"] + "</td>");

    writer.Write("<td>" + item["Author"] + "</td>");

    }

    writer.Write("</tr></table>");

    }

    }

    }

    部署 项目编译后把DLL放入MOSS站点所在文件夹中

    "C:/Inetpub/wwwroot/wss/VirtualDirectories/www.qsh.com81/_app_bin"

    打开Reflector查看GetListWebPart.dll 的Assembly信息(即Name后的内容)。

    打开MOSS站点的WEB.CONFIG文件添加如下二行配置:

    <SafeControl Assembly="GetListWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cbcb1fd6d083e9f7" Namespace="GetListWebPart" TypeName="ListWebPart" Safe="True" />

    <SafeControl Assembly="GetListWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cbcb1fd6d083e9f7" Namespace="GetListWebPart" TypeName="ListItemWebPart" Safe="True" />

    MOSS中添加,如下图:

    进入站点设置,点Galleries -> Web Parts

    点NEW.

    选中我们之前创建的二个WEBPART,点Populate Gallery

    返回,成功加入后如下:

     

    打开要添加WEBPART的页面,点Edit Page,添加:

    添加完成后如下:

    (5) 调试首先打开使用webPart的站点,再打开工程。依次点工程菜单上Debug -> Attach to Process。在Attach to Process界面中可能出现几个w3wp.exe的进程,我们必须找到webPart站点对应的进程。这时进入命令行输入”iisapp”查看IIS6应用程序池所对应的进程ID,然后在选择正确的进程附加。附加之后工程变成Debug状态,操作webPart页面,就可以进入工程中已设置断点的地方。

    最新回复(0)