如何自定义SharePoint列表列聚合(总计算)?
-
05-07-2019 - |
题
我有一个类型为“单行文本”的SharePoint列表列。开箱即用SharePoint仅提供显示此列类型的“计数”总计的功能。我希望能够对数据执行自定义聚合(特别是为了克服这种缺陷)。
我找到了使用 XSLT 和 Javascript 但我相信这两种方法都会在数据分页的地方失败(只聚合屏幕上显示的列表内容的子集)。 / p>
我想保留 ListViewWebPart的功能(渲染,排序,过滤,视图定义,操作菜单等)但添加此功能。我怎么能这样做?
解决方案 2
我没有机会对它进行全面测试,但这是我能想到的最好的方法:
创建一个 WebPart
,其中包含两个控件:
-
ViewToolBar
,其中包含要显示的列表/视图的上下文 - 包含要显示的视图的呈现HTML的
Literal
醇>
然后将其呈现为原始列表/视图。
在渲染 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
作为文本列总计的问题。此外,有可能在视图的初始渲染和用于聚合的项目检索之间更改列表可能会在总计和显示的项目之间产生差异。
其他提示
你可以用总数做的唯一事情是:
平均;计数;最大;敏;和;标准偏差;方差
不确定如何计算其他任何内容。
不隶属于 StackOverflow