65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中分组 Gridview

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (46投票s)

2014年4月19日

CPOL

4分钟阅读

viewsIcon

98712

downloadIcon

5757

一种简化的方法来分组 ASP.NET MVC 中的 Gridview 数据

引言

如今,在 Gridview 中分组数据正变得越来越重要的 UI 功能。在 ASP.NET MVC 中,您需要完全控制 HTML,因此许多人不愿使用第三方控件。开发人员通常使用简单的 for 循环来显示表格/网格,以便他们可以轻松地根据自己的需求进行自定义。本文将通过直接在视图中编码的方式,为您提供一种简化的 Gridview 数据分组方法。您还可以根据需要将自定义数据放入组的标题和页脚中。此外,我还展示了如何使用 JQuery 来实现展开/折叠行为的示例。我使用了 Razor 视图引擎,但同样的方法也适用于所有其他视图引擎。

下面是分组后的 Gridview 外观的屏幕截图

背景

这种方法使用 Linq 的 group by 来分组 Gridview 源中的数据,然后使用常规的循环以所需的格式显示数据。JQuery 已用于客户端自定义行为。对于 UI 的外观和感觉,使用了默认的 Bootstrap。在附加的代码中,提供了 4 个不同的视图,以便逐步深入到最终的网格,这样初学者就不会发现理解概念有困难。

Using the Code

使用代码很简单。只需查看视图(.cshtml 文件),其中使用了 Linq GroupBy 查询来分组模型。然后,我们遍历了组,再遍历了组内的每个数据。

用于分组的基本代码如下所示

@foreach(var group in Model.GroupBy(x=>x.Company))
    {
        <tr class="group-header">
            <td colspan="6">
                <span class="h3">@group.Key</span>
            </td>
        </tr>
        foreach (var item in group)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Designation)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Department)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Company)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Year)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Salary)
                </td>
            </tr>
        }
        <tr class="group-footer">
            <td colspan="6">
                <span class="label label-info">Company: @group.Key</span>
                <span class="label label-success">Total Employee: @group.Count()</span>
                <span class="label label-primary">Avg Salary: 
                       @group.Average(x => x.Salary).ToString("C")</span>
            </td>
        </tr>
    }  

在上面的代码中,首先,我们基于需要分组的字段创建一个组。然后,循环遍历每个组,其中包含生成组标题和页脚作为表格行的代码。然后,我们实现了一个嵌套的 foreach 循环,以遍历组中的每个项目并显示数据。在组标题和页脚中,您可以实现任何自定义逻辑并以任何格式显示数据。在此示例中,我们演示了基本的 Linq 操作,如页脚中的总计数平均值。您也可以在标题中显示相同的内容。

样式和脚本

上面的代码将在浏览器中显示分组的数据,但要添加展开/折叠功能,需要一点 JQuery。

展开/折叠的代码如下所示

$(function () {
        $('.group-header').click(function () {
            $(this).nextUntil('.group-header').toggle();
        });
    }); 

在此代码中,我们只是处理每个组标题的单击事件。由于在网格的每个表头行都分配了一个名为 'group-header' 的类,因此我们可以使用此选择器来切换该组的显示。

除了上述内容,您还可以实现各种其他样式或脚本行为,例如

  • 展开/折叠所有标题
  • 切换所有标题/页脚
  • 展开/折叠所有数据等。

为行添加索引

只需 2-3 行 JQuery 代码即可为网格中的每行添加索引。下面的代码演示了这一点

function addPaging() {
        $('#employeeGrid tr:first').prepend('<th style="width:60px;">S. No.</th>');
        $('#employeeGrid tr:not(:first, .group-header, .group-footer)').each(function (index) {
            $(this).prepend('<td class="text-right">' + (index + 1) + '.</td>');
        });
    }

函数的最后一行将一个 th(表头列)标签添加到网格表的第一个行。接下来的代码循环遍历 HTML 表的每一行,并在每行(tr 标签)前面添加一个新的 td 标签,并应用索引。请查看附加代码中的“示例网格”页面,以实际查看效果。

关注点

除了在 MVC 中分组 Gridview 数据之外,该代码还充当了一个示例,演示如何从 Excel 中读取数据并使用泛型填充模型。要读取 Excel 数据,使用了 nuget 包 'EPPlus'。

结论

由于您使用原始 HTML 来生成网格,因此您的自由度是无限的。您可以根据需要自定义您的网格。如果您正在使用任何第三方控件,您可能无法获得高度的灵活性。

在我看来,如果时间允许且您优先考虑性能,请使用原生方法。否则,市场上有许多 MVC 网格工具(付费和免费的)可以帮助您快速开发应用程序。

历史

  • 2014 年 4 月 19 日:创建第一个版本
© . All rights reserved.