如何自定义SharePoint列表列聚合(总计算)?

时间:2009-11-27 11:39:10

标签: sharepoint listview web-parts wss-3.0

我有一个类型为“单行文本”的SharePoint列表列。开箱即用SharePoint仅提供显示此列类型的“计数”总计的功能。我希望能够对数据执行自定义聚合(特别是对作为文本保存的数字数据进行求和以克服this deficiency)。

我找到了使用XSLTJavascript为计算列执行类似操作的示例,但我相信这两种方法都会在数据分页的地方失败(仅聚合显示的列表内容的子集)在屏幕上。)

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

2 个答案:

答案 0 :(得分:0)

你可以用总数做的唯一事情是:

平均;计数;最大;敏;和;标准偏差;方差

不确定如何计算其他任何内容。

答案 1 :(得分:0)

我没有机会对它进行全面测试,但这是我能想到的最好的方法:

创建一个包含两个控件的WebPart

  1. 一个ViewToolBar,其中包含要显示的列表/视图的上下文
  2. 包含要显示的视图的呈现HTML的Literal
  3. 然后将其呈现为原始列表/视图。

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

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

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

    代码的草图:

    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作为文本列总计的问题。此外,有可能在视图的初始渲染和用于聚合的项目检索之间更改列表可能会在总计和显示的项目之间产生差异。