0

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

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

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

4

2 回答 2

0

您可以对总计做的唯一事情是:

平均的; 数数; 最大限度; 最小;和; 标准偏差;方差

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

于 2009-11-27T12:34:07.170 回答
0

我没有机会完全测试它,但这是我能想到的最好的:

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

  1. AViewToolBar与要显示的列表/视图的上下文
  2. ALiteral包含要显示的视图的渲染 HTML

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

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

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

将总计呈现为 HTML 中的隐藏值,并使用 Javascript 覆盖呈现的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为文本列总数的问题。此外,在视图的初始呈现和检索项目以进行聚合之间对列表的更改可能会在总数和显示的项目之间产生差异。

于 2009-12-09T11:07:34.713 回答