public override void RenderGroupTable(TModel[] items, IGridGroupOptions groupOptions, IPagedList paginationViewModel) { var isHierarchy = GridModel.HierarchyUrl != null; Writer.Write("<div class=\"grid-group-wrap\">"); Writer.Write("<table class=\"grid-group-table\"><thead>"); var nextSortOrder = GridModel.Multisort ? (OrderedVisibleColumns.Any(x => x.Value.SortOrder.HasValue) ? (OrderedVisibleColumns.Where(x => x.Value.SortOrder.HasValue).Max(x => x.Value.SortOrder) + 1) : 0) : 0; if (isHierarchy) { Writer.Write("<th class=\"hierarchy-cell\"></th>"); } foreach (var column in OrderedVisibleColumns) { RenderColumnHeader(column.Value, column.Key, nextSortOrder.GetValueOrDefault(0), true); } if (isHierarchy) { Writer.Write("<th class=\"hierarchy-cell-right\"></th>"); } Writer.Write("</thead>"); Writer.Write("<tbody>"); var alternate = false; for (var i = 0; i < items.Length; i++) { RenderTableRow(items[i], OrderedVisibleColumns, alternate); alternate = !alternate; } if (GridModel.ShowEmptyRowsInGroup) { for (var i = items.Length; i < GridModel.PageSizeInGroup; 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>"); Writer.Write("</table>"); RenderGroupGridState(groupOptions); RenderPager(paginationViewModel, GridGroupPageLinkClass, true); Writer.Write("</div>"); }
public override void RenderTableRow(TModel item, IEnumerable <KeyValuePair <string, IGridColumn <TModel> > > columns, bool alternate, int level = 0, bool empty = false) { var tr = new TagBuilder("tr"); var isHierarchy = GridModel.HierarchyUrl != null; var rowAttributes = GridModel.RowAttributes != null?GridModel.RowAttributes(item, HtmlHelper) : null; tr.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(rowAttributes)); if (alternate) { tr.Attributes["class"] = tr.Attributes.ContainsKey("class")? String.Format("{0} {1}", tr.Attributes["class"], AlternateRowClass): AlternateRowClass; } Writer.Write(tr.ToString(TagRenderMode.StartTag)); if (isHierarchy) { if (empty) { Writer.Write("<td class=\"hierarchy-cell\"></td>"); } else { Writer.Write("<td class=\"hierarchy-cell\"><a href=\"{0}\" class=\"grid-icon {1} plus\"></a></td>", GridModel.HierarchyUrl(item, UrlHelper), GridHierarchyLinkClass); } } var cols = columns as KeyValuePair <string, IGridColumn <TModel> >[] ?? columns.ToArray(); for (var i = 0; i < cols.Length; i++) { var td = new TagBuilder("td"); td.MergeAttributes(cols[i].Value.Attributes); var value = item != null?GetCellValue(cols[i].Value, item) : null; Writer.Write(td.ToString(TagRenderMode.StartTag)); if (i == 0) { var padding = new StringBuilder(); for (var j = 0; j < level * GridModel.SeparatorLevelLength; j++) { padding.Append(" "); } Writer.Write(padding.ToString()); } value = empty ? " " : value; Writer.Write(value); Writer.Write("</td>"); } if (isHierarchy) { Writer.Write("<td class=\"hierarchy-cell-right\"></td>"); } Writer.Write("</tr>"); if (isHierarchy) { Writer.Write("<tr style=\"display:none;\"><td class=\"hierarchy-cell\"></td>"); Writer.Write("<td class=\"grid-hierarchy-row\" colspan=\"{0}\"></td>", OrderedVisibleColumns.Count()); Writer.Write("<td class=\"hierarchy-cell-right\"></td>"); Writer.Write("</tr>"); } var alt = alternate; if (GridModel.ChildSelector != null) { var childrens = GridModel.ChildSelector(item); if (childrens != null) { level = level + 1; foreach (var children in childrens) { alt = !alt; RenderTableRow(children, cols, alt, level); } } } }
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); }