首先创建一个abstract类,继承Microsoft.SharePoint.WebControls.DataTableDataSourceView。之后基于这个类可以创建多个显示不同数据的的DataSourceView,在上文的DataSource控件中有个ViewName属性,可以通过这个属性来区分不同的DataSourceView,从而显示不同的数据。
abstract DataSourceView的实现:
public string Filter
{
get
{
if (ViewState["Filter"] == null)
{
return "";
}
return ViewState["Filter"].ToString();
}
set
{
ViewState["Filter"] = value;
}
}
public string FilterExpression
{
get
{
if (mFilterExpression == null)
{
return "";
}
return mFilterExpression;
}
set
{
Filter = value;
if (this.FilterExpression != value)
{
this.mFilterExpression = value;
this.OnDataSourceViewChanged(EventArgs.Empty);
}
}
}
Filter用来记录过滤条件,SPGridView通过FilterExpression将界面上用户点击的过滤条件传入这个属性中。
之后在继承这个DataSourceView的子类中实现排序和过滤的功能。而分页是通过SharePoint的一个SPGridViewPager绑定这个SPGridView控件就可实现,我就不介绍了。
DataSourceView子类的实现:
public class ACFrontEndDataSourceView : ACDataSourceView
{
private static readonly string[] mColumnNames = new string[] { "Name", "Status", "Address" };
public ACFrontEndDataSourceView(DataSourceControl owner, string viewName, HttpContext context)
: base(owner, viewName, context)
{
}
protected override void FillDataTable(DataTable table, DataSourceSelectArguments selectArguments)
{
try
{
bool isDesc = false;
string sort = "Name";
if (!String.IsNullOrEmpty(this.SortField))
{
sort = this.SortField;
isDesc = this.SortDir.Equals("DESC");
}
else if (selectArguments.SortExpression != null && selectArguments.SortExpression != String.Empty)
{
sort = selectArguments.SortExpression;
if (selectArguments.SortExpression.EndsWith("DESC"))
{
isDesc = true;
sort = sort.Substring(0, sort.IndexOf("DESC")).Trim();
}
}
int count = 0;
ArrayList serverList = new ArrayList();
if (IsFilter)
{
//获取所需填充的全部数据
}
else
{
//获取Count值,表示根据Filter过滤条件的条目个数
//根据Filter过滤条件获取所有条目列表serverList
for (int i = 0; i < this.PageIndex; i++)
{
for (int j = 0; j < this.PageSize; j++)
{
table.Rows.Add(table.NewRow());
}
}
}
foreach (object server in serverList)
{
DataRow row = table.NewRow();
row[0] = "";
row[1] = "";
row[2] = "";
table.Rows.Add(row);
}
if (!IsFilter)
{
for (int i = 0; i < count - (this.PageIndex + 1) * this.PageSize; i++)
{
table.Rows.Add(table.NewRow());
}
}
}
catch(Exception ex)
{
throw ex;
}
}
protected override IEnumerable Select(DataSourceSelectArguments selectArguments)
{
DataTable table = this.CreateDataTable();
this.FillDataTable(table, selectArguments);
DataView defaultView = table.DefaultView;
return defaultView;
}
protected override string[] ColumnNames
{
get
{
return mColumnNames;
}
}
protected override string DefaultSortExpression
{
get
{
return "Name ASC";
}
}
}
这样就可以实现SharePoint的过滤与排序功能,并且在DataTable中填充需要显示的数据,而不是全部。
然而SharePoint的过滤仍然不很让人满意,因为只能有一个过滤条件。如何实现SharePoint的多条件过滤呢?通过使用Reflector对SPGridView的源代码进行查看,我发现SharePoint SPGridView只能实现单过滤条件,而且不能在界面出现过滤图标。如何实现多过滤将在之后的文章中进行介绍。