|
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
[ToolboxData("<{0}:MyDataSource runat=server></{0}:MyDataSource>")]
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
[MergableProperty(false), DefaultValue((string)null), PersistenceMode(PersistenceMode.InnerProperty)]
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的实现在后面的文章再介绍。 |
|