在表格中状态栏中显示统计信息
本帖最后由 Richard.Ma 于 2022-3-1 11:07 编辑FlexGrid 是一个功能强大的网格控件,提供所有基本和高级功能,例如大纲树、排序、单元格合并、自定义编辑、下拉框、图像列表和自动数据聚合。此控件提供强大的 API 和广泛的设计时支持,为最终用户提供熟悉的类似 Excel 的体验。当网格中显示大量计算数据时,我们可能需要在运行时查看 Sum、Maximum、Minimum、Count 和 Average 等统计数据,与 Microsoft Excel 在状态栏中提供的相同。如下图:https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20220215-how-to-show-cell-selection-statistics-in-winforms-datagrid/Excel.gif
通过将 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 控件。https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20220215-how-to-show-cell-selection-statistics-in-winforms-datagrid/2-toolbox.gif
将 FlexGrid 控件拖放到 Form 上以显示数据,将 ToolStrip 控件拖放到 ToolStripLabel 作为项目以显示统计信息。https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20220215-how-to-show-cell-selection-statistics-in-winforms-datagrid/3-flexgrid.gif
将数据源分配给 FlexGrid完成布局后,使用 DataSource 属性将数据附加到网格。此博客使用自定义类 DataSource.cs 从 NORTHWIND 数据库接收订单详细信息数据。该数据库位于我们系统中的以下位置:C:\Users\【UserName】\Documents\ComponentOne Samples\Common
自定义类的 GetRows 函数用于使用下面给出的查询字符串检索数据,以将其分配给 FlexGrid 的 DataSource 属性。var sql = @"SELECT Distinct Orders., Orders.OrderDate, Shippers.CompanyName, Customers.Country as Country, + ' ' + AS Salesperson, Products.ProductName AS Product, .UnitPrice as UnitPrice, .Quantity, .Discount, (.**(1-)/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 ON Orders.OrderID = .OrderID) ON Products.ProductID = .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();
}
上述所有步骤完成后,应用程序显示如下:https://gccontent.blob.core.windows.net/gccontent/blogs/componentone/20220215-how-to-show-cell-selection-statistics-in-winforms-datagrid/4-final.gif
如果您已经安装了 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
页:
[1]