예제 #1
0
        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);
        }
예제 #2
0
        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();
            }
        }