У меня не было возможности полностью протестировать его, но это лучшее, что я мог придумать:
Создайте WebPart
, который содержит два элемента управления:
- A
ViewToolBar
с контекстом отображаемого списка / представления
- A
Literal
, содержащий визуализированный HTML-код отображаемого представления
Это будет отображаться как исходный список / представление.
При рендеринге WebPart
получите элементы из представления, указав RowLimit
в качестве максимального значения, чтобы были извлечены все элементы (не только первая страница).
Перебирать элементы, вычисляя итоги в подходящем типе данных, чтобы сохранить точность.
Визуализируйте итоговое значение как скрытое значение в HTML и перезаписайте отображаемое итоговое значение Count
с помощью Javascript, например, описанным здесь методом .
Грубый набросок кода:
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
для текстовых столбцов. Также существует вероятность того, что изменения в списке между начальным отображением представлением и извлечением элементов для агрегации могут привести к расхождениям между итоговыми и отображаемыми элементами.