对AreaCollection中的元素进行排序—SharePoint新闻列表WebPart开发手记
本文主要讲如何对新闻区域下的子区域按照区域的序号进行排序。
一般用下面的代码获取新闻区域下的子区域:
areas就是我们要获取的新闻区域子区域的集合,但得到的areas中的每个Area并没有按照每个区域的序号排序。而每个区域有个Order属性,新闻页面左边的区域导航就是按照这个Order属性从小到大显示的,“管理门户网站”中也是按照这个属性从小从大的顺序显示区域的。我想在新闻列表WebPart中也按照这个顺序显示。SharePoint自带的新闻区域中,子区域是按照每个子区域中最新列表的添加时间排序的,这样的排序是随时会变的,一般的新闻显示时,栏目是按照固定的顺序显示的。所以就需要对areas中的元素进行排序,排序的方法有多种,我先用了一种笨方法,用DataTable的Select方法排序,代码如下:
一般用下面的代码获取新闻区域下的子区域:
Guid guid = AreaManager.GetSystemAreaGuid(PortalContext.Current,SystemArea.News);
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
areas就是我们要获取的新闻区域子区域的集合,但得到的areas中的每个Area并没有按照每个区域的序号排序。而每个区域有个Order属性,新闻页面左边的区域导航就是按照这个Order属性从小到大显示的,“管理门户网站”中也是按照这个属性从小从大的顺序显示区域的。我想在新闻列表WebPart中也按照这个顺序显示。SharePoint自带的新闻区域中,子区域是按照每个子区域中最新列表的添加时间排序的,这样的排序是随时会变的,一般的新闻显示时,栏目是按照固定的顺序显示的。所以就需要对areas中的元素进行排序,排序的方法有多种,我先用了一种笨方法,用DataTable的Select方法排序,代码如下:
protected override void RenderWebPart(HtmlTextWriter output)
{
Guid guid = AreaManager.GetSystemAreaGuid(PortalContext.Current,SystemArea.News);
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
output.RenderBeginTag(HtmlTextWriterTag.Table);
DataTable areaTable = new DataTable("Areas");
DataColumn idColumn = new DataColumn();
idColumn.DataType = System.Type.GetType("System.Int32");
idColumn.ColumnName = "id";
areaTable.Columns.Add(idColumn);
DataColumn fTitleColumn = new DataColumn();
fTitleColumn.DataType = System.Type.GetType("System.String");
fTitleColumn.ColumnName = "Title";
areaTable.Columns.Add(fTitleColumn);
DataRow row = null;
for(uint i=0;i<areas.Count;i++)
{
row = areaTable.NewRow();
row["id"] = areas[i].Order;
row["Title"] = areas[i].Title;
areaTable.Rows.Add(row);
}
DataRow[] areaRows = areaTable.Select(null,"id");
for(uint i=0;i<areaRows.Length;i++)
{
output.RenderBeginTag(HtmlTextWriterTag.Tr);
output.RenderBeginTag(HtmlTextWriterTag.Td);
output.Write(areaRows[i][1].ToString());
output.RenderEndTag();
output.RenderEndTag();
}
output.RenderEndTag();
}
{
Guid guid = AreaManager.GetSystemAreaGuid(PortalContext.Current,SystemArea.News);
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
output.RenderBeginTag(HtmlTextWriterTag.Table);
DataTable areaTable = new DataTable("Areas");
DataColumn idColumn = new DataColumn();
idColumn.DataType = System.Type.GetType("System.Int32");
idColumn.ColumnName = "id";
areaTable.Columns.Add(idColumn);
DataColumn fTitleColumn = new DataColumn();
fTitleColumn.DataType = System.Type.GetType("System.String");
fTitleColumn.ColumnName = "Title";
areaTable.Columns.Add(fTitleColumn);
DataRow row = null;
for(uint i=0;i<areas.Count;i++)
{
row = areaTable.NewRow();
row["id"] = areas[i].Order;
row["Title"] = areas[i].Title;
areaTable.Rows.Add(row);
}
DataRow[] areaRows = areaTable.Select(null,"id");
for(uint i=0;i<areaRows.Length;i++)
{
output.RenderBeginTag(HtmlTextWriterTag.Tr);
output.RenderBeginTag(HtmlTextWriterTag.Td);
output.Write(areaRows[i][1].ToString());
output.RenderEndTag();
output.RenderEndTag();
}
output.RenderEndTag();
}
很显然,这种方法不是好方法,我想到另外一种方法,用ArrayList的Sort方法,先建立一个实现IComparer的类AreaComparer,再将ArrayCollection复制到ArrayList中,调用al.Sort(new AreaComparer())进行排序,代码如下:
protected override void RenderWebPart(HtmlTextWriter output)
{
Guid guid = AreaManager.GetSystemAreaGuid(PortalContext.Current,SystemArea.News);
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
ArrayList al = new ArrayList();
for(uint i=0;i<areas.Count;i++)
{
al.Add(areas[i]);
}
al.Sort(new AreaComparer());
output.RenderBeginTag(HtmlTextWriterTag.Table);
for(int i=0;i<al.Count;i++)
{
output.RenderBeginTag(HtmlTextWriterTag.Tr);
output.RenderBeginTag(HtmlTextWriterTag.Td);
output.Write(((Area)al[i]).Title+((Area)al[i]).Order);
output.RenderEndTag();
output.RenderEndTag();
}
output.RenderEndTag();
}
public class AreaComparer : IComparer
{
public int Compare(Object x, Object y)
{
if(((Area)x).Order < ((Area)y).Order)
{
return -1;
}
return 1;
}
}
{
Guid guid = AreaManager.GetSystemAreaGuid(PortalContext.Current,SystemArea.News);
Area area = AreaManager.GetArea(PortalContext.Current,guid);
AreaCollection areas = area.Areas;
ArrayList al = new ArrayList();
for(uint i=0;i<areas.Count;i++)
{
al.Add(areas[i]);
}
al.Sort(new AreaComparer());
output.RenderBeginTag(HtmlTextWriterTag.Table);
for(int i=0;i<al.Count;i++)
{
output.RenderBeginTag(HtmlTextWriterTag.Tr);
output.RenderBeginTag(HtmlTextWriterTag.Td);
output.Write(((Area)al[i]).Title+((Area)al[i]).Order);
output.RenderEndTag();
output.RenderEndTag();
}
output.RenderEndTag();
}
public class AreaComparer : IComparer
{
public int Compare(Object x, Object y)
{
if(((Area)x).Order < ((Area)y).Order)
{
return -1;
}
return 1;
}
}