C#中DataGrid指定行求和:按同名汇总Price列
解决DataGrid中同名数据的Price列求和问题
方案1:SQL查询阶段直接聚合(推荐)
从数据库层面完成分组求和,效率最高,返回结果直接绑定到DataGrid即可展示每个名称的总价格。
假设你的数据表名为Products,执行以下SQL语句:
SELECT Name, SUM(Price) AS TotalPrice FROM Products GROUP BY Name
查询结果会返回每个唯一Name对应的Price总和(比如A对应10,B对应11),直接将结果集绑定到DataGrid就能实现单独汇总效果。
如果需要筛选特定名称(比如只汇总A或B),可添加WHERE条件:
SELECT Name, SUM(Price) AS TotalPrice FROM Products WHERE Name IN ('A', 'B') GROUP BY Name
方案2:前端DataGrid中处理(保留原始数据时适用)
如果需要保留原始数据展示,同时在前端完成分组求和,可利用语言自带的集合处理能力:
C#(WPF/WinForms/Blazor)
假设数据实体为Product(包含Name和Price属性),从数据库获取原始数据后用LINQ分组求和:
var rawData = GetProductsFromDatabase(); // 从SQL获取原始数据 var summarizedData = rawData .GroupBy(p => p.Name) .Select(g => new { Name = g.Key, TotalPrice = g.Sum(p => p.Price) }) .ToList(); // 绑定到DataGrid yourDataGrid.ItemsSource = summarizedData;
JavaScript(Vue/React等前端框架)
用数组reduce方法实现分组求和:
// 假设原始数据为rawData数组 const summarizedData = Object.values(rawData.reduce((acc, item) => { if (!acc[item.Name]) { acc[item.Name] = { Name: item.Name, TotalPrice: 0 }; } acc[item.Name].TotalPrice += item.Price; return acc; }, {})); // 绑定到DataGrid组件 yourDataGrid.data = summarizedData;
方案3:DataGrid分组显示并在组内求和(保留原始数据+分组汇总)
如果需要同时展示原始数据和对应名称的求和值,可利用DataGrid的分组功能,以Name为分组依据,在组头/组尾显示总和:
以WPF DataGrid为例,XAML配置如下:
<DataGrid x:Name="yourDataGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="价格" Binding="{Binding Price}" /> </DataGrid.Columns> <DataGrid.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="0,5"> <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="14" /> <TextBlock Text=" 总价格: " Margin="10,0" /> <TextBlock Text="{Binding Items, Converter={StaticResource SumPriceConverter}}" /> </StackPanel> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </DataGrid.GroupStyle> </DataGrid>
需实现值转换器SumPriceConverter计算组内价格总和:
public class SumPriceConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var items = value as IEnumerable<Product>; return items?.Sum(p => p.Price) ?? 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
最后在资源中声明转换器:
<Window.Resources> <local:SumPriceConverter x:Key="SumPriceConverter" /> </Window.Resources>
内容的提问来源于stack exchange,提问作者Andy García
相关产品推荐
相关产品推荐

