2009-11-27 172 views
0

我有一个类型为'单行文本'的SharePoint列表列。开箱即用SharePoint仅提供了显示此列类型的“计数”总计的功能。我希望能够对数据执行自定义聚合(具体来说,将以数字形式保存为文本的数据进行求和以克服this deficiency)。如何自定义SharePoint列表列聚合(总计)计算?

我已经找到了使用XSLTJavascript做对于计算列,类似的例子,但我认为,这两种方法都失败,其中的数据分页(仅聚集在屏幕上显示的列表内容的子集)。

我想保留ListViewWebPart(渲染,排序,过滤,视图定义,操作菜单等)的功能,但添加此功能。我怎样才能做到这一点?

回答

0

我已经没有机会充分测试,但这个是我能想出的最好:

创建WebPart其中包含两个控件:

  1. 一个ViewToolBar与上下文要显示的列表/视图
  2. Literal包含视图的呈现的HTML被显示

然后这将呈现为原始列表/视图。

在渲染WebPart时,从视图中获取项目,将RowLimit指定为最大值,以便检索所有项目(而不仅仅是第一页)。

迭代项目,计算合适的数据类型总数以保持精度。

将总数渲染为HTML中的隐藏值,并用Javascript(例如method described here)覆盖整个呈现的Count

代码的草图:

public sealed class TextAggregatingWebPart : WebPart { 
    protected override void CreateChildControls() { 
    base.CreateChildControls(); 

    var web = SPContext.Current.Web; 
    var list = web.Lists[SourceList]; 
    var view = list.Views[ViewOfSourceList]; 

    var toolbar = new ViewToolBar(); 
    var context = SPContext.GetContext(
    Context, view.ID, list.ID, SPContext.Current.Web); 
    toolbar.RenderContext = context; 
    Controls.Add(toolbar); 

    var viewHtml = new Literal {Text = view.RenderAsHtml()}; 
    Controls.Add(viewHtml); 
    } 

    protected override void Render(HtmlTextWriter writer) { 
    EnsureChildControls(); 
    base.Render(writer); 

    var web = SPContext.Current.Web; 
    var list = web.Lists[SourceList]; 
    var view = list.Views[ViewOfSourceList]; 

    var items = list.GetItems(new SPQuery(view) {RowLimit = uint.MaxValue}); 
    foreach (SPItem item in items) { 
     // Calculate total 
    } 

    // Render total and Javascript to replace Count 
    } 
} 

请注意,这并不与修改视图屏幕只显示Count作为一个整体对文本列解决问题。此外,视图初始渲染和检索聚合项目之间的列表更改可能会导致总数与显示项目之间出现差异。

0

总计您唯一能做的事情是:

Average;计数;最大;敏;和;标准偏差;差异

不知道如何计算其他任何东西。