You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WPF DataGrid列求和咨询:无法通过Rows属性访问行

WPF DataGrid列求和的解决方案

嘿,我来帮你搞定这个WPF DataGrid列求和的问题!你遇到的DataGrid.Rows无法使用的情况很正常——因为WPF的DataGrid和WinForms的不一样,它没有Rows属性,而是用Items集合来管理数据项。下面给你两种靠谱的实现方式,其中更推荐的是从数据源直接计算的方法,既简洁又可靠。

方法一:直接从数据源计算(推荐)

既然你的DataGrid是通过数据绑定展示tutar字段的,那最好直接从绑定的数据源集合中求和,完全不需要依赖UI元素,避免了格式转换错误或者UI元素为空的问题。

假设你的数据源是一个类似这样的集合(比如ObservableCollection):

// 定义你的数据模型
public class LabItem
{
    public decimal tutar { get; set; }
    // 其他属性...
}

// 在你的用户控件/ViewModel中定义数据源
private ObservableCollection<LabItem> _labItems;
public ObservableCollection<LabItem> LabItems
{
    get => _labItems;
    set
    {
        _labItems = value;
        // 如果实现了INotifyPropertyChanged,这里触发通知
        OnPropertyChanged(nameof(LabItems));
    }
}

// 绑定DataGrid的ItemsSource
grid_lab.ItemsSource = LabItems;

那求和只需要一行LINQ代码就能搞定:

decimal sum = LabItems.Sum(item => item.tutar);

这种方式的好处是:

  • 代码简洁,可读性强
  • 不依赖UI结构,就算你调整了列的顺序或者修改了UI样式,求和逻辑不受影响
  • 避免了字符串转decimal的潜在错误(比如格式不匹配、空值等)

方法二:通过UI元素获取值(适合无法直接访问数据源的场景)

如果因为某些原因你必须从DataGrid的UI元素中取值,那可以优化你原来的代码,解决潜在的问题:

原来代码的问题

  1. 依赖列索引7,如果后续调整列的顺序,代码会出错
  2. 直接用decimal.Parse没有处理空值或格式错误的情况,容易抛出异常
  3. Items.Count - 1是多余的——因为你已经设置了CanUserAddRows="False",不会有新增的空行

优化后的代码

decimal sum = 0m;
// 遍历所有数据项
foreach (var item in grid_lab.Items)
{
    // 找到表头为"Tutar"的列(避免依赖索引)
    var tutarColumn = grid_lab.Columns.FirstOrDefault(c => c.Header.ToString() == "Tutar");
    if (tutarColumn == null) continue;

    // 获取单元格的TextBlock
    var textBlock = tutarColumn.GetCellContent(item) as TextBlock;
    // 安全转换,避免空引用和格式错误
    if (textBlock != null && decimal.TryParse(textBlock.Text, out decimal value))
    {
        sum += value;
    }
}

关键提醒

  • 尽量使用方法一,这符合WPF的数据绑定思想(数据和UI分离),代码更健壮
  • 确保你的数据模型中tutar属性是decimal类型,而不是字符串——这样不仅能避免转换错误,还能让数据处理更规范

内容的提问来源于stack exchange,提问作者user8210624

火山引擎 最新活动