【问题标题】:c# WPF - Add total row in a DataGridc# WPF - 在 DataGrid 中添加总行
【发布时间】:2014-02-21 10:19:54
【问题描述】:

我有这个数据网格:

我想在 DataGrid 的底部添加一行,其中包含名称:总计和价格:所有价格的总和。如果有可能,这一行将被冻结。 你有什么想法? 简单的项目在这个链接中:here

编辑 1 这是 XAML 代码:

<DataGrid ItemsSource="{Binding Articles}" AutoGenerateColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Price" Binding="{Binding Price}" />               
        </DataGrid.Columns>
    </DataGrid>

这是 ViewModel:

[Export(typeof(IShell))]
public class MainViewModel : Screen
{
    public System.ComponentModel.ICollectionView Articles { get; set; }

    public MainViewModel()
    {
        Articles = CollectionViewSource.GetDefaultView(GetArticles());
    }


    private List<Article> GetArticles()
    {
        List<Article> arts = new List<Article>();

        arts.Add(new Article { Name = "Name1", Price = 2.80 });
        arts.Add(new Article { Name = "Name2", Price = 1.25 });
        arts.Add(new Article { Name = "Name3", Price = 9.32 });
        arts.Add(new Article { Name = "Name4", Price = 1.31 });
        arts.Add(new Article { Name = "Name5", Price = 0.80});
        arts.Add(new Article { Name = "Name6", Price = 2.50});
        arts.Add(new Article { Name = "Name7", Price = 0.50 });

        return arts;
    }

}

【问题讨论】:

  • 如果你在这里发布你的代码的简化版本而不是整个项目的链接会更好
  • 好的,我做到了。我更新了问题

标签: c# .net wpf datagrid caliburn.micro


【解决方案1】:

您可以在数据网格下方添加一个文本块并将其绑定到具有总价的属性,而不是将最后一行添加到数据网格。

【讨论】:

    【解决方案2】:

    还有一个:

    private List<Article> GetArticles()
        {
            List<Article> arts = new List<Article>();
    
            arts.Add(new Article { Name = "Name1", Price = 2.80 });
            arts.Add(new Article { Name = "Name2", Price = 1.25 });
            arts.Add(new Article { Name = "Name3", Price = 9.32 });
            arts.Add(new Article { Name = "Name4", Price = 1.31 });
            arts.Add(new Article { Name = "Name5", Price = 0.80 });
            arts.Add(new Article { Name = "Name6", Price = 2.50 });
            arts.Add(new Article { Name = "Name7", Price = 0.50 });
            arts.Add(new Article { Name = "Total", Price = arts.Sum(l => l.Price)});
            return arts;
        }
    

    【讨论】:

    • 免费创建最后一行,创建 DataGridRowStyle,添加 setter 一个 ReadOnlyProperty,并与源 Name 属性和 IValueConverter 绑定:如果 Name == "Total" return true else return false
    • 是一个很好的解决方案,但是如果我在 datagrid 中有一个过滤器,那么文章“Total”会丢失吗?
    • 是的,他确实禁用了列名中的顺序。第一次,添加带有总计的新行,这不是一个好主意。我会在网格下有两个具有此值的文本块。
    • 也许是的,你知道如何在网格下添加文本块并绑定到总数吗?
    • 是的,您在 ViewModel 中添加了一个新属性“TotalPrice”,并在艺术属性的 set 方法中重新计算总价格。在 XAML 中,有两个 texblock,一个是“总”文本,另一个是绑定到 TotalPrice 属性。
    【解决方案3】:

    这应该很有帮助。我只添加了一个新行,其中包含一种求和的方法

    private List<Article> GetArticles()
        {
            List<Article> arts = new List<Article>();
    
            arts.Add(new Article { Name = "Name1", Price = 2.80 });
            arts.Add(new Article { Name = "Name2", Price = 1.25 });
            arts.Add(new Article { Name = "Name3", Price = 9.32 });
            arts.Add(new Article { Name = "Name4", Price = 1.31 });
            arts.Add(new Article { Name = "Name5", Price = 0.80 });
            arts.Add(new Article { Name = "Name6", Price = 2.50 });
            arts.Add(new Article { Name = "Name7", Price = 0.50 });
            arts.Add(new Article {Name = "Total", Price = GetTotal(arts)});
            return arts;
        }
    
        private double GetTotal(List<Article> arts)
        {
            double Total = 0;
            foreach (Article art in arts)
            {
                Total += double.Parse(art.Price.ToString());
            }
            return Total;
        }
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 2011-08-26
      • 2015-04-06
      • 2017-01-20
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多