xuyangus 发表于 2015-9-28 13:16:04

SharePoint GridView的使用,DataSource的实现

  SharePoint GridView使用可以通过两种方式来使用:
1. 直接给SPGridVew的DataSource属性赋值一个DataTable, 之后调用BindData方法。缺点是只使用SPGridView来显示数据,而排序,分页,过滤和其他的功能都不可用。
2. 通过SPGridView的DataSourceId绑定一个DataSource控件,之后就可以通过这个DataSource控件实现SPGridView的排序,分页,过滤等功能。
  关于SPGridView的菜单项,排序分页和过滤的实现可以参考:http://www.cnblogs.com/ericfine/archive/2008/10/22/1316431.html
http://blog.iyunv.com/ericfine/archive/2008/10/23/3130387.aspx
  然而我的实现方式并和他一样,在上面链接的文章当中,SPGridView的排序可以使用,过滤也只能过滤一个条件,同时还要一个缺点,如果要显示的数据有上千甚至上万条的数据时,SPGridView还是将全部的数据导入到DataTable中,结果却只显示其中的10(SPGridView的PageSize)条,这样不但速度效率会非常的慢。
  如下是我的实现方式:使用Microsoft.SharePoint.WebControlsDataTableDataSourceView和System.Web.UI.DataSourceControl控件。
WebControlsDataTableDataSourceView是SharePoint实现的一个DataSourceView的派生类。它的主要方法有

Code
IEnumerable Select(DataSourceSelectArguments selectArguments)  我就不多说了,贴代码给大家直接看吧:
  页面:

Code
<Mine:MyDataSource runat="server" ID="DataSource" ViewName="FilterJob" ></Mine:MyDataSource>
                        <SharePoint:SPGridView PagerSettings-Visible="true" AllowPaging="true" ID="ViewList" runat="server" AllowFiltering="true" FilteredDataSourcePropertyFormat="{1} = '{0}'" FilteredDataSourcePropertyName="FilterExpression"
                         FilterDataFields=",JobId,PlanName,StartTime,EndTime,Status,Progress" DataSourceID="DataSource" AutoGenerateColumns="False" AllowSorting="True" BorderStyle="None" CssClass="ms-listviewtable" GridLines="None"Width="100%">   
                            <SelectedRowStyle CssClass="ms-selectednav" Font-Bold="True" />
                            <AlternatingRowStyle CssClass="ms-alternating" />
          </SharePoint:SPGridView>  由于为了实现国际化,Columns的添加在后台,我就不介绍了,上面的那两个链接。
  自定义DataSource的实现:
  

Code

    public class MyDataSource : DataSourceControl
    {
      private ACDataSourceView mView;
      private string mViewName;
      private static string[] mViewNames = new string[] { "FrontEnd", "ScanJob", "ScanReport", "FilterJob", "FilterReport", "ManualScan", "ContentFilter", "RealTimeReport" ,"Test"};

      // Methods
      protected virtual ACDataSourceView CreateView()
      {
            int num = -1;
            if (!String.IsNullOrEmpty(this.ViewName) && (num = GetViewNumber()) != -1)
            {
                switch (num)
                {
                  case 0:
                        return new ACFrontEndDataSourceView(this, this.ViewName, this.Context);
                  case 1:
                        return new ACJobDataSourceView(this, this.ViewName, this.Context);
                  case 2:
                        return new ACScanReportDataSourceView(this, this.ViewName, this.Context);
                  case 3:
                        return new ACJobDataSourceView(this, this.ViewName, this.Context, true);
                  case 4:
                        return new ACFilterReportDataSourceView(this, this.ViewName, this.Context);
                  case 5:
                        return new ACPlanListView(this, this.ViewName, this.Context, false);
                  case 6:
                        return new ACPlanListView(this, this.ViewName, this.Context, true);
                  case 7:
                        return new ACScanReportDataSourceView(this, this.ViewName, this.Context);
                  case 8:
                        return new ACTestDataSourceView(this, this.ViewName, this.Context);
                  default:
                        break;
                }
            }
            return null;
      }

      private int GetViewNumber()
      {
            for (int i = 0; i < mViewNames.Length; i++)
            {
                if (mViewNames == mViewName)
                {
                  return i;
                }
            }
            return -1;
      }

      protected override DataSourceView GetView(string viewName)
      {
            return this.View;
      }

      protected override ICollection GetViewNames()
      {
            return mViewNames;
      }

      private void LoadCompleteEventHandler(object sender, EventArgs e)
      {
            this.SelectParameters.UpdateValues(this.Context, this);
      }

      protected override void LoadViewState(object savedState)
      {
            Pair pair = (Pair)savedState;
            if (savedState != null)
            {
                base.LoadViewState(pair.First);
                if (pair.Second != null)
                {
                  this.View.LoadViewState(pair.Second);
                }
            }
            else
            {
                base.LoadViewState(null);
            }
      }

      protected override void OnInit(EventArgs e)
      {
            base.OnInit(e);
            this.Page.LoadComplete += new EventHandler(this.LoadCompleteEventHandler);
      }

      protected override object SaveViewState()
      {
            Pair pair = new Pair();
            pair.First = base.SaveViewState();
            if (this.mView != null)
            {
                pair.Second = this.mView.SaveViewState();
            }
            if (pair.First != null)
            {
                return pair;
            }
            if (pair.Second != null)
            {
                return pair;
            }
            return null;
      }

      protected override void TrackViewState()
      {
            base.TrackViewState();
            if (this.mView != null)
            {
                this.mView.TrackViewState();
            }
      }

      // Properties
      
      public ParameterCollection SelectParameters
      {
            get
            {
                return this.View.SelectParameters;
            }
      }

      protected ACDataSourceView View
      {
            get
            {
                if (this.mView == null)
                {
                  this.mView = this.CreateView();
                  if (base.IsTrackingViewState)
                  {
                        this.mView.TrackViewState();
                  }
                }
                return this.mView;
            }
      }

      public string ViewName
      {
            get
            {
                return this.mViewName;
            }
            set
            {
                mViewName = value;
            }
      }

      public string FilterExpression
      {
            get
            {
                return this.View.FilterExpression;
            }
            set
            {
                this.View.FilterExpression = value;
            }
      }

      public bool IsFilter
      {
            get
            {
                return this.View.IsFilter;
            }
            set
            {
                this.View.IsFilter = value;
            }
      }  DataSourceView的实现在后面的文章再介绍。
页: [1]
查看完整版本: SharePoint GridView的使用,DataSource的实现