原文:http://msdn2.microsoft.com/en-us/library/bb466219.aspx
开发ASP.NET应用时,通常需要显示行列格式的表格类型数据。尽管我们可以通过程序创建一个HTML表格来实现该需求,但不如使用ASP.NET 2.0中GridView这样的服务器端控件来得更便捷。在WSS平台中同样也提供了一个SPGridView控件,从ASP.NET GridView控件继承而来。该控件为我们在SharePoint开发中显示表格型数据提供了很大的便利。
在我们添加一个SPGridView控件到一个自定义页面中之前,我们首先必须通过@Register在页面顶部添加一个指向Microsoft.SharePoint.dll的注册,并引用Microsoft.SharePoint.WebControls命名空间。
<
%@ Register
Tagprefix ="SharePoint"
Namespace ="Microsoft.SharePoint.WebControls"
Assembly ="Microsoft.SharePoint, [4-part assembly name] " % >
Tagprefix ="SharePoint"
Namespace ="Microsoft.SharePoint.WebControls"
Assembly ="Microsoft.SharePoint, [4-part assembly name] " % >
完成@Register注册部分编写后,我们就可以在应用程序页面中创建SPGridView控件的标记了。注意,标记前必须加上注册时指定的前缀。
<
SharePoint:SPGridView
runat ="server"
ID ="grdPropertyValues"
AutoGenerateColumns ="false"
RowStyle-BackColor ="#DDDDDD"
AlternatingRowStyle-BackColor ="#EEEEEE" />
runat ="server"
ID ="grdPropertyValues"
AutoGenerateColumns ="false"
RowStyle-BackColor ="#DDDDDD"
AlternatingRowStyle-BackColor ="#EEEEEE" />
与其他ASP.NET中的Grid控件不同,SPGridView控件并不支持自动生成栏。如果你不指定AutoGenerateColumns属性为"false", 将会得到一个运行时错误。
用SPGridView控件显示一个ADO.NET的DataTable
填充一个SPGridView控件最简单的办法就是创建一个ADO.NET DataTable。因为我们可以将DataTable的DefaultView属性指定到SPGridView控件的DataSource上作为SPGridView的数据源,然后直接调用DataBind方法即可。
下面的示例展示了一个名为PropertyCollectionBinder的工具类,通过这个类包装了以下工作:创建并显示一个具有两栏数据的ADO.NET DataTable。同时,这个类还提供一个很有用的方法BindGird,接受一个SPGridView控件做参数,并会调用其数据绑定方法来展示ADO.NET DataTable的数据。
using
System.Data;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
public class PropertyCollectionBinder {
protected DataTable PropertyCollection = new DataTable();
public PropertyCollectionBinder() {
PropertyCollection.Columns.Add( " PropertyName " , typeof ( string ));
PropertyCollection.Columns.Add( " PropertyValue " , typeof ( string ));
}
public void AddProperty( string PropertyName, string PropertyValue) {
DataRow newRow = PropertyCollection.Rows.Add();
newRow[ " PropertyName " ] = PropertyName;
newRow[ " PropertyValue " ] = PropertyValue;
}
public void BindGrid(SPGridView grid) {
SPBoundField fldPropertyName = new SPBoundField();
fldPropertyName.HeaderText = " Property Name " ;
fldPropertyName.DataField = " PropertyName " ;
grid.Columns.Add(fldPropertyName);
SPBoundField fldPropertyValue = new SPBoundField();
fldPropertyValue.HeaderText = " Value " ;
fldPropertyValue.DataField = " PropertyValue " ;
grid.Columns.Add(fldPropertyValue);
grid.DataSource = PropertyCollection.DefaultView;
grid.DataBind();
}
}
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
public class PropertyCollectionBinder {
protected DataTable PropertyCollection = new DataTable();
public PropertyCollectionBinder() {
PropertyCollection.Columns.Add( " PropertyName " , typeof ( string ));
PropertyCollection.Columns.Add( " PropertyValue " , typeof ( string ));
}
public void AddProperty( string PropertyName, string PropertyValue) {
DataRow newRow = PropertyCollection.Rows.Add();
newRow[ " PropertyName " ] = PropertyName;
newRow[ " PropertyValue " ] = PropertyValue;
}
public void BindGrid(SPGridView grid) {
SPBoundField fldPropertyName = new SPBoundField();
fldPropertyName.HeaderText = " Property Name " ;
fldPropertyName.DataField = " PropertyName " ;
grid.Columns.Add(fldPropertyName);
SPBoundField fldPropertyValue = new SPBoundField();
fldPropertyValue.HeaderText = " Value " ;
fldPropertyValue.DataField = " PropertyValue " ;
grid.Columns.Add(fldPropertyValue);
grid.DataSource = PropertyCollection.DefaultView;
grid.DataBind();
}
}
用PropertyCollectionBinder 来绑定数据
这样我们就可以通过在自定义页面的后台代码中使用PropertyCollectionBinder类来简化用SPGridView控件显示一系列名/值对的过程。下面给出一个这样的例子,通过SPGridView来显示调用WSS对象模型得到的一些属性值。
SPSite siteCollection
=
this
.Site;
SPWeb site = this .Web;
PropertyCollectionBinder pcb = new PropertyCollectionBinder();
pcb.AddProperty( " Site Title " , site.Title);
pcb.AddProperty( " Site ID " , site.ID.ToString().ToUpper());
pcb.AddProperty( " Current User Name " , site.CurrentUser.Name);
pcb.BindGrid(grdPropertyValues);
SPWeb site = this .Web;
PropertyCollectionBinder pcb = new PropertyCollectionBinder();
pcb.AddProperty( " Site Title " , site.Title);
pcb.AddProperty( " Site ID " , site.ID.ToString().ToUpper());
pcb.AddProperty( " Current User Name " , site.CurrentUser.Name);
pcb.BindGrid(grdPropertyValues);
在基于SharePoint的解决方案中使用SPGridView控件还有一个好处,就是该控件已经集成了WSSv3的样式。同样,在SharePoint的标准后台页面和WebPart中也大量使用了该控件。这就是说,在SharePoint中我们的自定义应用程序和WebPart,都可以使用SPGridView控件,并且可以获得与标准的SharePoint界面相同的外观。
SPGridView控件不支持自动生成栏,所以我们必须明确的使用SPBoundField来绑定每个栏,正如上面的例子所写的那样。然而,产生用于展示的数据确并不困难。我们可以创建一个ADO.NET DataTable或者通过使用query类型的对象返回一个DataTable,例如使用SPSiteDataQuery对象进行一个在网站集范围内的跨多个列表的查询,并将返回的DataTable指定给SPGridView做数据源,是不是很酷?
查看视频