为List配置一个搜索按钮
查询前的List首页,只有一个cusotmer
customer下面有个Project文件夹和Cusotmer Complaint文件
其中Customer Complaint.txt文件是有多个属性的
现在开始针对文档库中所有的文件 和文件夹进行模糊查询
前段代码
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SearchList.ascx.cs" Inherits="MySharePointDev.Public.SearchList" %>
<table>
<tr>
<td>
<asp:Label ID="labKeyWord" runat="server" Text="KeyWord:" Font-Bold="True" ></asp:Label>
<asp:TextBox ID="tbKeyWord" runat="server" ></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" onclick="btnSearch_Click"
Text="Search" />
</td>
</tr>
</table>
<table>
<tr>
<td>
<asp:Label ID="labKeyWord" runat="server" Text="KeyWord:" Font-Bold="True" ></asp:Label>
<asp:TextBox ID="tbKeyWord" runat="server" ></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" onclick="btnSearch_Click"
Text="Search" />
</td>
</tr>
</table>
后端代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;
using System.Xml;
using System.Web.UI.WebControls.WebParts;
namespace MySharePointDev.Public
{
public partial class SearchList : BaseSPWebPart
{
private string _QueryFields = "Title;";
[Personalizable(PersonalizationScope.Shared)]
[WebBrowsable]
[WebDisplayName("查询的字段显示名,以分号分隔开")]
public string QueryFields
{
get
{
if (_QueryFields.EndsWith(";"))//防止以;结束
{
return _QueryFields.Substring(0, _QueryFields.Length - 2);
}
else
{
return _QueryFields;
}
}
set { _QueryFields = value; }
}
private SPList List
{
get
{
return SPContext.Current.List;
}
}
protected void Page_Load(object sender, EventArgs e)
{
//this.ExportMode = WebPartExportMode.All;
tbKeyWord.ToolTip = "Please input: " + QueryFields;
}
/// <summary>
/// search
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSearch_Click(object sender, EventArgs e)
{
if (this.tbKeyWord.Text != "")
{
string[] fields = QueryFields.Split(';');
string cmal = "";
foreach (string field in fields)
{
if (cmal == "") //第一个参数
{
cmal = string.Format(@"<Contains>
<FieldRef Name='{0}' />
<Value Type='{1}'>{2}</Value>
</Contains>
", List.Fields[field].InternalName, List.Fields[field].Type.ToString(), this.tbKeyWord.Text.ToString());
}
else
{
cmal = "<Or>" + cmal + string.Format(@"<Contains>
<FieldRef Name='{0}' />
<Value Type='{1}'>{2}</Value>
</Contains></Or>
", List.Fields[field].InternalName, List.Fields[field].Type.ToString(), this.tbKeyWord.Text.ToString());
}
}
cmal = "<Where>" + cmal + "</Where>";
this.SetCurrentListViewSchemaQuery(cmal);
}
}
/// <summary>
/// 设置当前list的视图 schema query
/// </summary>
/// <param name="cmal"></param>
private void SetCurrentListViewSchemaQuery(string cmal)
{
if (!string.IsNullOrEmpty(cmal))
{
string str = "{" + this.List.ID.ToString() + "}";
ControlCollection cc = this.Page.Controls;
GetControls(ref cc, str, cmal);
}
}
/// <summary>
/// 遍历所有页面中所有控件
/// </summary>
/// <param name="cs">页面控件集</param>
/// <param name="str"></param>
/// <param name="cmal"></param>
private void GetControls(ref ControlCollection cs, string str, string cmal)
{
foreach (Control webPart in cs)
{
if (webPart.HasControls())
{
ControlCollection cc = webPart.Controls;
GetControls(ref cc, str, cmal);
}
if (webPart is ListViewWebPart)
{
ListViewWebPart listViewWebPart = (ListViewWebPart)webPart;
if (string.Compare(listViewWebPart.ListName, str, true) != 0)
{
continue;
}
if (string.IsNullOrEmpty(cmal))
{
listViewWebPart.ListViewXml = this.List.Views[new Guid(listViewWebPart.ViewGuid)].HtmlSchemaXml;
}
else
{
//申明个新的XmlDocument,将listViewWebPart的ListViewXml装载进去
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(listViewWebPart.ListViewXml);
//用cmal替换掉原有的查询语句
this.ChangeSchemaXmlCaml(xmlDocument, cmal);
listViewWebPart.ListViewXml = xmlDocument.InnerXml;
}
}
}
}
/// <summary>
/// move where 去除外部的Where和/Where
/// </summary>
/// <param name="q"></param>
/// <returns></returns>
private string GetInnerQuery(string q)
{
XmlDocument docuemnt = new XmlDocument();
docuemnt.LoadXml(q);
return docuemnt.DocumentElement.InnerXml;
}
/// <summary>
/// change schema xml query
/// </summary>
/// <param name="xmlDocument"></param>
/// <param name="query"></param>
private void ChangeSchemaXmlCaml(XmlDocument xmlDocument, string query)
{
if (!string.IsNullOrEmpty(query))
{
string innerXml = this.GetInnerQuery(query);
if (innerXml != "")
{
//获得Query部分的XmlNode
XmlNode node = xmlDocument.DocumentElement.SelectSingleNode("Query");
XmlNode oldChild = node.SelectSingleNode("Where");
//如果有Where,去除它
if (oldChild != null)
{
node.RemoveChild(oldChild);
}
//新建一个Where,并将我们的query的主体内容赋值给其InnerXml,并在QuerNode中添该Node
XmlNode newChild = xmlDocument.CreateElement("Where");
newChild.InnerXml = innerXml;
node.AppendChild(newChild);
//将搜索文件的类型修改为list中的所有文件和文件夹,默认为只搜索当前目录下的文件
if (xmlDocument.DocumentElement.Attributes["Scope"] == null)
{
XmlAttribute attScope = xmlDocument.CreateAttribute("Scope");
attScope.Value = "RecursiveAll";
xmlDocument.DocumentElement.Attributes.Append(attScope);
}
else
{
xmlDocument.DocumentElement.Attributes["Scope"].Value = "RecursiveAll";
}
//替换XML中的ViewEmpty部分,该部分显示没有数据的时候的内容
xmlDocument.DocumentElement.SelectSingleNode("ViewEmpty").InnerXml = "<HTML><![CDATA[<font color='red'><b>No Results match keyword!</b></font>]]></HTML>";
}
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;
using System.Xml;
using System.Web.UI.WebControls.WebParts;
namespace MySharePointDev.Public
{
public partial class SearchList : BaseSPWebPart
{
private string _QueryFields = "Title;";
[Personalizable(PersonalizationScope.Shared)]
[WebBrowsable]
[WebDisplayName("查询的字段显示名,以分号分隔开")]
public string QueryFields
{
get
{
if (_QueryFields.EndsWith(";"))//防止以;结束
{
return _QueryFields.Substring(0, _QueryFields.Length - 2);
}
else
{
return _QueryFields;
}
}
set { _QueryFields = value; }
}
private SPList List
{
get
{
return SPContext.Current.List;
}
}
protected void Page_Load(object sender, EventArgs e)
{
//this.ExportMode = WebPartExportMode.All;
tbKeyWord.ToolTip = "Please input: " + QueryFields;
}
/// <summary>
/// search
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnSearch_Click(object sender, EventArgs e)
{
if (this.tbKeyWord.Text != "")
{
string[] fields = QueryFields.Split(';');
string cmal = "";
foreach (string field in fields)
{
if (cmal == "") //第一个参数
{
cmal = string.Format(@"<Contains>
<FieldRef Name='{0}' />
<Value Type='{1}'>{2}</Value>
</Contains>
", List.Fields[field].InternalName, List.Fields[field].Type.ToString(), this.tbKeyWord.Text.ToString());
}
else
{
cmal = "<Or>" + cmal + string.Format(@"<Contains>
<FieldRef Name='{0}' />
<Value Type='{1}'>{2}</Value>
</Contains></Or>
", List.Fields[field].InternalName, List.Fields[field].Type.ToString(), this.tbKeyWord.Text.ToString());
}
}
cmal = "<Where>" + cmal + "</Where>";
this.SetCurrentListViewSchemaQuery(cmal);
}
}
/// <summary>
/// 设置当前list的视图 schema query
/// </summary>
/// <param name="cmal"></param>
private void SetCurrentListViewSchemaQuery(string cmal)
{
if (!string.IsNullOrEmpty(cmal))
{
string str = "{" + this.List.ID.ToString() + "}";
ControlCollection cc = this.Page.Controls;
GetControls(ref cc, str, cmal);
}
}
/// <summary>
/// 遍历所有页面中所有控件
/// </summary>
/// <param name="cs">页面控件集</param>
/// <param name="str"></param>
/// <param name="cmal"></param>
private void GetControls(ref ControlCollection cs, string str, string cmal)
{
foreach (Control webPart in cs)
{
if (webPart.HasControls())
{
ControlCollection cc = webPart.Controls;
GetControls(ref cc, str, cmal);
}
if (webPart is ListViewWebPart)
{
ListViewWebPart listViewWebPart = (ListViewWebPart)webPart;
if (string.Compare(listViewWebPart.ListName, str, true) != 0)
{
continue;
}
if (string.IsNullOrEmpty(cmal))
{
listViewWebPart.ListViewXml = this.List.Views[new Guid(listViewWebPart.ViewGuid)].HtmlSchemaXml;
}
else
{
//申明个新的XmlDocument,将listViewWebPart的ListViewXml装载进去
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(listViewWebPart.ListViewXml);
//用cmal替换掉原有的查询语句
this.ChangeSchemaXmlCaml(xmlDocument, cmal);
listViewWebPart.ListViewXml = xmlDocument.InnerXml;
}
}
}
}
/// <summary>
/// move where 去除外部的Where和/Where
/// </summary>
/// <param name="q"></param>
/// <returns></returns>
private string GetInnerQuery(string q)
{
XmlDocument docuemnt = new XmlDocument();
docuemnt.LoadXml(q);
return docuemnt.DocumentElement.InnerXml;
}
/// <summary>
/// change schema xml query
/// </summary>
/// <param name="xmlDocument"></param>
/// <param name="query"></param>
private void ChangeSchemaXmlCaml(XmlDocument xmlDocument, string query)
{
if (!string.IsNullOrEmpty(query))
{
string innerXml = this.GetInnerQuery(query);
if (innerXml != "")
{
//获得Query部分的XmlNode
XmlNode node = xmlDocument.DocumentElement.SelectSingleNode("Query");
XmlNode oldChild = node.SelectSingleNode("Where");
//如果有Where,去除它
if (oldChild != null)
{
node.RemoveChild(oldChild);
}
//新建一个Where,并将我们的query的主体内容赋值给其InnerXml,并在QuerNode中添该Node
XmlNode newChild = xmlDocument.CreateElement("Where");
newChild.InnerXml = innerXml;
node.AppendChild(newChild);
//将搜索文件的类型修改为list中的所有文件和文件夹,默认为只搜索当前目录下的文件
if (xmlDocument.DocumentElement.Attributes["Scope"] == null)
{
XmlAttribute attScope = xmlDocument.CreateAttribute("Scope");
attScope.Value = "RecursiveAll";
xmlDocument.DocumentElement.Attributes.Append(attScope);
}
else
{
xmlDocument.DocumentElement.Attributes["Scope"].Value = "RecursiveAll";
}
//替换XML中的ViewEmpty部分,该部分显示没有数据的时候的内容
xmlDocument.DocumentElement.SelectSingleNode("ViewEmpty").InnerXml = "<HTML><![CDATA[<font color='red'><b>No Results match keyword!</b></font>]]></HTML>";
}
}
}
}
}