悠闲小风专栏

SharePoint & Workflow 解决方案

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

内容摘要:

         创建自定义web部件,使用查询对象模型对搜索组件执行查询,实现非常基础的搜索功能。

1.       创建项目

2.       编写查询代码

3.       部署web部件

4.       启动Search服务,设置爬网

OK,以上所述是笔者这个例子主要涉及到的四个部分内容概览,具体步骤请往下看

创建项目

         打开visual studio 2005,新建一个类库,“名称”字段输入“CustomSearchWebPart”,然后单击“确定”。

         删除名为“Class1”的类,添加新建项,在已安装模板中选择“Web自定义控件”,命名为“clsSearchQuery”。

添加对下列程序集的引用:

n  Microsoft.SharePoint.dll

n  Microsoft.Office.Server.dll

n  Microsoft.Office.Server.Search.dll

配置项目生成后的命令行(具体操作请参阅前几篇文章内容)

编写代码

         导入下列命名空间:

        using Microsoft.SharePoint.WebPartPages;

using Microsoft.Office.Server;

using Microsoft.Office.Server.Search.Query;

         在类的声明之上添加代码:

                   [XmlRoot(Namespace = "CustomSearchWebPart")]

    让类clsSearchQuery继承WebPart类:

                   public class clsSearchQuery : WebPart

         在类中声明我们需要用到的控件:

                   Button cmdSearch;    //搜索按钮

        TextBox txtQueryText;   //查询关键字

        Label lblQueryResult;    //提示查询结果

        DataGrid grdResults;    //用于显示结果

    在类中重写WebPart的创建子控件方法,实现注册控件以及注册按钮的事件:

                   protected override void CreateChildControls()

        {

            Controls.Clear();

            txtQueryText = new TextBox();

            txtQueryText.Width = Unit.Parse("200px");   //设置文本框的长度

            this.Controls.Add(txtQueryText);

            cmdSearch = new Button();

            cmdSearch.Text = "搜索";

            cmdSearch.Width = Unit.Parse("70px");

            cmdSearch.Click += new EventHandler(cmdSearch_Click);   //按钮的事件处理

            this.Controls.Add(cmdSearch);

            lblQueryResult = new Label();

            this.Controls.Add(lblQueryResult);

        }

    搜索按钮的事件:

        void cmdSearch_Click(object sender, EventArgs e)

        {

            lblQueryResult.Text = string.Empty;

            if (txtQueryText.Text != string.Empty)

            {

                keywordQueryExecute(txtQueryText.Text);   //调用执行查询的方法

            }

            else

            {

                lblQueryResult.Text = "请输入您要检索的内容.";

            }

        }

    通过关键字执行查询的方法:

        private void keywordQueryExecute(string strQueryText)

        {

            KeywordQuery kRequest = new KeywordQuery(ServerContext.Current);

            string strQuery = strQueryText;

            kRequest.QueryText = strQuery;

            kRequest.ResultTypes |= ResultType.RelevantResults; //一定要指定

            ResultTableCollection resultTbls = kRequest.Execute();

            if ((int)ResultType.RelevantResults != 0)

            {

                ResultTable tblResult = resultTbls[ResultType.RelevantResults];

                if (tblResult.TotalRows == 0)

                {

                    lblQueryResult.Text = "没有找到与关键字\""+strQueryText+"\"相关的结果.";

                }

                else

                {

                    ReadResultTable(tblResult);  //调用方法,将返回结果写入临时表中

                }

            }

        }

    结果写入临时表中:  

        void ReadResultTable(ResultTable rt)

        {

            DataTable relResultsTbl = new DataTable();

            relResultsTbl.TableName = "Relevant Results";

            DataSet ds = new DataSet("resultsset");

            ds.Tables.Add(relResultsTbl);

            ds.Load(rt, LoadOption.OverwriteChanges, relResultsTbl);

            fillResultsGrid(ds);

        }

    数据源绑定到数据窗格控件:

        private void fillResultsGrid(DataSet grdDs)

        {

            //实例化DataGrid控件,指定其数据源

            grdResults = new DataGrid();

            grdResults.DataSource = grdDs;

            //设置DataGrid的显示属性.

            grdResults.GridLines = GridLines.None;

            grdResults.CellPadding = 4;

            grdResults.Width = Unit.Percentage(100);

            grdResults.ItemStyle.ForeColor = Color.Black;

            grdResults.ItemStyle.BackColor = Color.AliceBlue;

            grdResults.ItemStyle.Font.Size = FontUnit.Smaller;

            grdResults.ItemStyle.Font.Name = "微软雅黑";

            grdResults.HeaderStyle.BackColor = Color.Navy;

            grdResults.HeaderStyle.ForeColor = Color.White;

            grdResults.HeaderStyle.Font.Bold = true;

            grdResults.HeaderStyle.Font.Name = "微软雅黑";

            grdResults.HeaderStyle.Font.Size = FontUnit.Medium;                       

            grdResults.AutoGenerateColumns = false;

            //构造数据窗格显示两列,一列为标题,一列为作者

            HyperLinkColumn colTitle = new HyperLinkColumn();

            colTitle.DataTextField = "Title";

            colTitle.HeaderText = "标题";

            colTitle.DataNavigateUrlField = "Path";

            grdResults.Columns.Add(colTitle);

            BoundColumn colAuthor = new BoundColumn();

            colAuthor.DataField = "Author";

            colAuthor.HeaderText = "作者";

            grdResults.Columns.Add(colAuthor);

            //绑定数据到DataGrid

            grdResults.DataBind();

            //注册DataGrid控件

            Controls.Add(grdResults);

        }

部署web部件

         生成项目,将生成CustomSearchWebPart.dll 复制到SharePoint网站的 bin 目录(如果你有编辑生成后的事件命令行,则省去复制这一操作)

         注册该控件为SafeControl,打开SharePoint网站下的web.config(这个网站是您要向其添加web部件的站点),将下面标记添加到web.config <SafeControls> </SafeControls> 部分:

                   <SafeControl Assembly="CustomSearchWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Namespace="CustomSearchWebPart" TypeName="*" Safe="True" />

         别忘记保存,到此为止,部署还没完成,还有一个重要的事情没做,新建一个记事本,写入如下XML代码:

                   <?xml version="1.0"?>

<WebPart xmlns="http://schemas.microsoft.com/WebPart/v2">

<Assembly>CustomSearchWebPart,Version=1.0.0.0,Culture=Neutral, PublicKeyToken=null</Assembly>

                        <TypeName>CustomSearchWebPart.clsSearchQuery</TypeName>

                        <Title>Custom Search Web Part</Title>

</WebPart>

    保存为.dwp格式,笔者命名为CustomSearchWebPart.dwp

         接下来,就可以在我们的站点上导入这个web part了,打开SharePoint网站,进入您要添加该web part的页面,依次点击“网站操作”->“编辑网页”,在web部件编辑区域点击“添加web部件”,选择“高级web部件库和选项”,如下图标记:

此时页面右边会弹出添加web部件边栏,点击导入按钮

浏览到.dwp所在目录,单击上载按钮

将上载成功的web part直接拖动到你要添加该部件的区域,然后选择右上角的“退出编辑模式”

启动Search服务,设置爬网

         打开SharePoint管理中心,依次选择“操作”->“服务器场上的服务”,确保您已经启动了“Office SharePoint Server搜索”服务

         进入“共享服务管理”,选择“搜索设置”项,点击“内容源和爬网计划”,启动“本地OSS网站”完全爬网,爬网时,你可以发现CPU的使用率基本是100%

         当您的CPU使用率降幅比较大时,这时候您就可以尝试一个Search,验证自定义搜索web部件是否有达到关键字搜索的目的,答案马上给您揭晓,回到SharePoint站点,笔者这里输入“doc”,结果列出了包含该关键字的所有文档,可见这个search是成功的。

         最后笔者提醒一件事,如果你再次上传了一个文档却没有搜索到,请您到管理中心的共享服务里头,编辑您的共享服务,然后再新建一个增量爬网即可。具体操作,恳请查阅相关资料。

 

posted on 2009-04-08 16:54  陈典洪  阅读(491)  评论(0编辑  收藏  举报