首先创建一个abstract类,继承Microsoft.SharePoint.WebControls.DataTableDataSourceView。之后基于这个类可以创建多个显示不同数据的的DataSourceView,在上文的DataSource控件中有个ViewName属性,可以通过这个属性来区分不同的DataSourceView,从而显示不同的数据。
abstract DataSourceView的实现:

 Code
Codepublic 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子类的实现:

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