public virtual IPagedList RenderTableBody(IQueryable <TModel> query) { Writer.Write("<tbody>"); IPagedList paginateModel; var sortColumns = OrderedVisibleColumns.Where(x => x.Value.SortDirection.HasValue).Select(x => x.Value).OrderBy(x => x.SortOrder).ToArray(); if (IsGroupGrid) { var groupColumns = OrderedVisibleColumns.Where(x => x.Value.GroupKeyProperty != null && x.Value.GroupOrder.HasValue).OrderBy(x => x.Value.GroupOrder).ToArray(); #region Инициализируем опции для группы var groupOptions = new GridGroupOptions { GPage = 1, GroupKey = new Dictionary <string, object>(), GColOpt = new Dictionary <string, IDictionary <string, object> >() }; foreach (var column in GridModel.Options.ColOpt.Where(x => x.Value.Any(c => c.Key == "so" || c.Key == "sd"))) { groupOptions.GColOpt[column.Key] = new Dictionary <string, object>(); foreach (var colOptions in column.Value) { groupOptions.GColOpt[column.Key][colOptions.Key] = colOptions.Value; } } #endregion var groupQuery = query.GroupBy(groupColumns.ToDictionary(x => x.Value.GroupKeyProperty, x => x.Value.GroupSortDirection)); var groupQueryCount = groupQuery.ToArray().Count(); var page = GridModel.Page == 0 ? 1 : GridModel.Page; if (page > (int)Math.Ceiling(((double)groupQueryCount) / GridModel.PageSize)) { page = 1; } var numberToSkip = (page - 1) * GridModel.PageSize; var items = groupQuery.Skip(numberToSkip).Take(GridModel.PageSize).ToArray(); paginateModel = new PagedListModel(page, GridModel.PageSize, groupQueryCount); var alternate = false; var columnCount = OrderedVisibleColumns.Count(); for (var i = 0; i < items.Length; i++) { var item = items[i]; RenderGroupTableRow(groupColumns, item, alternate, columnCount, groupOptions); alternate = !alternate; } if (GridModel.ShowEmptyRows) { if (GridModel.ShowEmptyRows) { for (var i = items.Length; i < GridModel.PageSize; i++) { RenderGroupTableRow(groupColumns, null, alternate, columnCount, groupOptions, empty: true); alternate = !alternate; } } } if (items.Length == 0) { Writer.Write("<tr>"); Writer.Write("<td class=\"empty-grid-row\" colspan=\"{1}\">{0}</td>", GridRenderOptions.EmptyText, OrderedVisibleColumns.Count() + 2); Writer.Write("</tr>"); } } else { query = query.Sort(sortColumns.ToDictionary(x => x.SortProperty, x => x.SortDirection)); var queryCount = query.Count(); var page = GridModel.Page == 0 ? 1 : GridModel.Page; if (page > (int)Math.Ceiling(((double)queryCount) / GridModel.PageSize)) { page = 1; } var numberToSkip = (page - 1) * GridModel.PageSize; var items = query.Skip(numberToSkip).Take(GridModel.PageSize).ToArray(); GridModel.PrepareSource(items); paginateModel = new PagedListModel(page, GridModel.PageSize, queryCount); var alternate = false; for (var i = 0; i < items.Length; i++) { var item = items[i]; RenderTableRow(item, OrderedVisibleColumns, alternate); alternate = !alternate; } if (GridModel.ShowEmptyRows) { for (var i = items.Length; i < GridModel.PageSize; i++) { RenderTableRow(null, OrderedVisibleColumns, alternate, empty: true); alternate = !alternate; } } if (items.Length == 0) { Writer.Write("<tr>"); Writer.Write("<td class=\"empty-grid-row\" colspan=\"{1}\">{0}</td>", GridRenderOptions.EmptyText, OrderedVisibleColumns.Count() + 2); Writer.Write("</tr>"); } else { RenderSummaryRow(items, OrderedVisibleColumns.ToArray()); } } Writer.Write("</tbody>"); return(paginateModel); }
public virtual void Render(HtmlHelper htmlHelper, IQueryable <TModel> query) { _orderedVisibleColumns = GridModel.Columns.Where(c => c.Value.IsVisible).OrderBy(c => c.Value.Order).ToList(); _isGroupGrid = _orderedVisibleColumns.Any(x => x.Value.GroupOrder.HasValue && x.Value.GroupKeyProperty != null); _htmlHelper = htmlHelper; _urlHelper = new UrlHelper(_htmlHelper.ViewContext.RequestContext); _writer = htmlHelper.ViewContext.Writer; _gridRenderOptions = GridModel.GridRenderOptions ?? new GridRenderOptions(); var groupOptions = ModelHelper.GetModel <GridGroupOptions>(GridModel.Prefix, null, null, HtmlHelper.ViewContext.Controller.ValueProvider, HtmlHelper.ViewContext.Controller.ControllerContext); if (groupOptions != null && groupOptions.GroupKey != null && groupOptions.GroupKey.Any()) { GridModel.MergeGridGroupOptions(groupOptions); var sortColumns = OrderedVisibleColumns.Where(x => x.Value.SortDirection.HasValue).Select(x => x.Value).OrderBy(x => x.SortOrder).ToArray(); var groupColumns = GridModel.Columns.Where(x => groupOptions.GroupKey.ContainsKey(x.Key)); query = groupColumns.Aggregate(query, (current, column) => current.Where(column.Value.GroupKeyProperty, groupOptions.GroupKey[column.Key])).Sort(sortColumns.ToDictionary(x => x.SortProperty, x => x.SortDirection)); var queryCount = query.Count(); var page = groupOptions.GPage == 0 ? 1 : groupOptions.GPage; if (page > (int)Math.Ceiling(((double)queryCount) / GridModel.PageSizeInGroup)) { page = 1; } var numberToSkip = (page - 1) * GridModel.PageSizeInGroup; var items = query.Skip(numberToSkip).Take(GridModel.PageSizeInGroup).ToArray(); GridModel.PrepareSource(items); var paginationModel = new PagedListModel(page, GridModel.PageSizeInGroup, queryCount); RenderGroupTable(items, groupOptions, paginationModel); } else { RenderGidContainerStart(); RenderGroupingHeader(); RenderTableStart(); RenderTableHeader(); var paginateModel = RenderTableBody(query); RenderTableEnd(); RenderGridState(); RenderPager(paginateModel, GridPageLinkClass, false); RenderGidContainerEnd(); } }