本帖最后由 Richard.Ma 于 2022-3-1 11:07 编辑
FlexGrid 是一个功能强大的网格控件,提供所有基本和高级功能,例如大纲树、排序、单元格合并、自定义编辑、下拉框、图像列表和自动数据聚合。此控件提供强大的 API 和广泛的设计时支持,为最终用户提供熟悉的类似 Excel 的体验。 当网格中显示大量计算数据时,我们可能需要在运行时查看 Sum、Maximum、Minimum、Count 和 Average 等统计数据,与 Microsoft Excel 在状态栏中提供的相同。如下图:
通过将 Microsoft 的 ToolStrip 与 FlexGrid 的 Aggregate 功能相结合,在 FlexGrid 中可以实现相同的功能。 要在 .NET 6.0 中使用 FlexGrid 获得此功能,请将实现分为以下步骤:
- 创建一个新的 .NET 6.0 Windows 窗体应用程序
- 将数据源分配给 FlexGrid
- 创建并处理 UpdateStatistics 方法以显示选择统计信息
创建新的 .NET 6.0 Windows 窗体应用程序使用 Visual Studio 2022 创建新的 Windows Forms .NET 6.0 应用程序并添加FlexGrid NuGet 包以获取工具箱中的 FlexGrid 控件。
将 FlexGrid 控件拖放到 Form 上以显示数据,将 ToolStrip 控件拖放到 ToolStripLabel 作为项目以显示统计信息。
将数据源分配给 FlexGrid完成布局后,使用 DataSource 属性将数据附加到网格。此博客使用自定义类 DataSource.cs 从 NORTHWIND 数据库接收订单详细信息数据。该数据库位于我们系统中的以下位置: C:\Users\【UserName】\Documents\ComponentOne Samples\Common
自定义类的 GetRows 函数用于使用下面给出的查询字符串检索数据,以将其分配给 FlexGrid 的 DataSource 属性。 - var sql = @"SELECT Distinct Orders.[OrderID], Orders.OrderDate, Shippers.CompanyName, Customers.Country as Country, [FirstName] + ' ' + [LastName] AS Salesperson, Products.ProductName AS Product, [Order Details].UnitPrice as UnitPrice, [Order Details].Quantity, [Order Details].Discount, ([Order Details].[UnitPrice]*[Quantity]*(1-[Discount])/100)*100 as ExtendedPrice FROM Shippers INNER JOIN (Products INNER JOIN ((Employees INNER JOIN (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) ON Employees.EmployeeID = Orders.EmployeeID) INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID) ON Products.ProductID = [Order Details].ProductID) ON Shippers.ShipperID = Orders.ShipVia;";
- SelectionStatisticsGrid.DataSource = DataSource.GetRows(sql);
复制代码
要组织数据,您可以使用以下代码根据 CompanyName 和 Country 列对数据进行分组:
- var groups = new List<GroupDescription>();
- var group1 = new GroupDescription("CompanyName", ListSortDirection.Descending, true);
- var group2 = new GroupDescription("Country", ListSortDirection.Descending, true);
- groups.Add(group1);
- groups.Add(group2);
复制代码
创建并处理 UpdateStatistics 方法以显示选择统计信息下一步是计算统计值,这将使用 FlexGrid 的 Aggregate 方法完成,该方法根据 AggregateEnum 参数计算当前选定单元格的各种聚合统计信息。 您需要使用不同的 AggregateEnum 值(例如 Average、Count、Min、Max 和 Sum)多次调用 Aggregate 方法以显示各种统计信息。最后,通过将其格式化为字符串对象,将其分配给 ToolStripLabel。 统计结果可能仅在选择多个单元格时才需要,因此您还应该检查此条件。 在考虑了上述所有因素之后,构造一个如下所示的UpdateStatistics方法:
- private void UpdateStatistics()
- {
- var text = string.Empty;
- if (!SelectionStatisticsGrid.Selection.IsSingleCell)
- {
- //Generate the Statistics Data to show into ToolStrip
- text = $"Average: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Average):F2} " +
- $" Count: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Count)} " +
- $" Minimum: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Min)} "+
- $" Maximum: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Max)} "+
- $" Summary: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Sum):F2}"; Page layout
- }
- selectionStatisticsLabel.Text = text;
- }
复制代码
处理 FlexGrid 的 SelChange 事件,该事件在进行新选择时触发。每当最终用户选择网格中的多个单元格时,调用其中的 UpdateStatistics 方法以在 ToolStripLabel 上显示统计信息。
- SelectionStatisticsGrid.SelChange += C1FlexGrid1_SelChange;
- private void C1FlexGrid1_SelChange(object? sender, EventArgs e)
- {
- UpdateStatistics();
- }
复制代码
上述所有步骤完成后,应用程序显示如下:
如果您已经安装了 C1 WinForms 套件,可以在系统的以下位置找到该示例。
.NET 6.0 控件:C:\Users\【UserName】\Documents\ComponentOne Samples\WinForms\v6.0\FlexGrid\CS\FlexGridExplorer
.NET 4.5.2 控件:C:\Users\【UserName】\Documents\ComponentOne Samples\WinForms\v4.5.2\FlexGrid\CS\SelectionStatistics
|