找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Ma 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-3-1 11:03  /   查看:2164  /  回复:0
本帖最后由 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 属性。
  1. 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;";

  2. SelectionStatisticsGrid.DataSource = DataSource.GetRows(sql);
复制代码

要组织数据,您可以使用以下代码根据 CompanyName 和 Country 列对数据进行分组:

  1. var groups = new List<GroupDescription>();
  2. var group1 = new GroupDescription("CompanyName", ListSortDirection.Descending, true);
  3. var group2 = new GroupDescription("Country", ListSortDirection.Descending, true);
  4. groups.Add(group1);
  5. groups.Add(group2);
复制代码


创建并处理 UpdateStatistics 方法以显示选择统计信息
下一步是计算统计值,这将使用 FlexGrid 的 Aggregate 方法完成,该方法根据 AggregateEnum 参数计算当前选定单元格的各种聚合统计信息。
您需要使用不同的 AggregateEnum 值(例如 Average、Count、Min、Max 和 Sum)多次调用 Aggregate 方法以显示各种统计信息。最后,通过将其格式化为字符串对象,将其分配给 ToolStripLabel。
统计结果可能仅在选择多个单元格时才需要,因此您还应该检查此条件。
在考虑了上述所有因素之后,构造一个如下所示的UpdateStatistics方法:

  1. private void UpdateStatistics()
  2. {
  3. var text = string.Empty;
  4. if (!SelectionStatisticsGrid.Selection.IsSingleCell)
  5. {
  6. //Generate the Statistics Data to show into ToolStrip
  7. text = $"Average: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Average):F2}  " +
  8. $"    Count: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Count)}  " +
  9. $"    Minimum: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Min)}  "+
  10. $"    Maximum: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Max)}  "+
  11. $"    Summary: {SelectionStatisticsGrid.Aggregate(AggregateEnum.Sum):F2}"; Page layout
  12. }
  13. selectionStatisticsLabel.Text = text;
  14. }
复制代码


处理 FlexGrid 的 SelChange 事件,该事件在进行新选择时触发。每当最终用户选择网格中的多个单元格时,调用其中的 UpdateStatistics 方法以在 ToolStripLabel 上显示统计信息。

  1. SelectionStatisticsGrid.SelChange += C1FlexGrid1_SelChange;
  2. private void C1FlexGrid1_SelChange(object? sender, EventArgs e)
  3. {
  4. UpdateStatistics();
  5. }
复制代码

上述所有步骤完成后,应用程序显示如下:

如果您已经安装了 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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部