【问题标题】:How can I customize SharePoint list column aggregation (total) calculations?如何自定义 SharePoint 列表列聚合(总计)计算?
【发布时间】:2009-11-27 11:39:10
【问题描述】:
我有一个类型为“单行文本”的 SharePoint 列表列。开箱即用 SharePoint 仅提供显示此列类型的“计数”总数的功能。我希望能够对数据执行自定义聚合(特别是将作为文本保存的数字数据求和以克服this deficiency)。
我找到了使用 XSLT 和 Javascript 对计算列执行类似操作的示例,但我相信这两种方法在数据分页时都会失败(仅聚合屏幕上显示的列表内容的子集)。
我想保留ListViewWebPart 的功能(渲染、排序、过滤、视图定义、操作菜单等),但要添加此功能。我该怎么做?
【问题讨论】:
标签:
sharepoint
listview
web-parts
wss-3.0
【解决方案1】:
您可以对总计做的唯一事情是:
平均;数数;最大限度;最小;和;标准偏差;方差
不知道如何计算其他东西。
【解决方案2】:
我没有机会对其进行全面测试,但这是我能想到的最好的:
创建一个包含两个控件的WebPart:
-
ViewToolBar 与要显示的列表/视图的上下文
-
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 显示为文本列的总数的问题。此外,在视图的初始呈现和检索项目以进行聚合之间对列表的更改可能会导致总数和显示的项目之间存在差异。