【问题标题】:How to get sum of selected DataGrid values in a C# WPF app?如何在 C# WPF 应用程序中获取选定 DataGrid 值的总和?
【发布时间】:2018-12-21 23:28:52
【问题描述】:

我有一个 C# WPF 应用程序,我的目标是从 DataGrid 中获取所选行值的总和,并使用该总数设置一个文本框。此总和计算由检测所选项目何时更改的事件触发。

问题是,当我一次选择多行或使用 Ctrl + A 全选时,我得到不可预测的总和值。

为了解决问题,我用 100 行绑定了数据网格,每行的数量为 1。然后我用 Ctrl + A 选择了所有项目。总和应该是 100,但上限为 7 或 8 个单位。

以下是我目前所拥有的。有人看到问题了吗?

private void DgDailyTransactions_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    decimal sum = 0;
    for (int i = 0; i < dgDailyTransactions.SelectedItems.Count; i++)
    {
        TextBlock tb = dgDailyTransactions.Columns[1].GetCellContent(dgDailyTransactions.SelectedItems[i]) as TextBlock;

        if (tb != null)
        {
            sum += Convert.ToDecimal(tb.Text);
        }
    }
    tbxSelectedDailyTransactionsTotal.Text = sum.ToString();
}

【问题讨论】:

    标签: c# wpf datagrid sum


    【解决方案1】:

    假设你的班级看起来像这样:

     public class Sales
        {
           public int Order { get; set; }
            public decimal Amount { get; set; }
        }
    

    做一个简单的方法如下:

        private void FindAmount()
        {
            decimal totalSum = 0;
            //Add amounts of selected
            if (MyDTGRID.SelectedItems.Count > 0)
            {
                for (int i = 0; i <= dgDailyTransactions.SelectedItems.Count - 1; i++)
                {
                    Sales sales = dgDailyTransactions.SelectedItems[i] as Sales;
    
                    decimal amount = sales.Amount;
                    totalSum += amount;
                }
            }
            myTextBlock.Text = totalSum.ToString();
        }
    

    只需在 selectedCellsChanged 事件中调用方法

        private void DgDailyTransactions_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            FindAmount();
        }
    

    我希望这会有所帮助。

    【讨论】:

    • 工作,谢谢,博尔凯。不知道我的解决方案有什么问题。
    • 我很高兴答案有所帮助。
    【解决方案2】:

    对于 sum 方法,您可以使用 linq(如果您不知道,我强烈建议您学习 linq,C# 中非常强大的工具),也建议您使用 MVVM,将使您的代码更容易以后调试:

    private void dgDailyTransactions_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            List<Sales> myList=dgDailyTransactions.SelectedItems.Cast<Sales>();
            decimal totalSum = 0;
            if (myList.Count() > 0)
            {
                totalSum = myList.Sum(item => item.Amount);
            }
            myTextBlock.Text = totalSum.ToString();
        }
    

    在 MVVM 中(如果你使用它)你只需要 Model 中的那一行:

    private void dgDailyTransactions_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                 contexte.SelectedSales= new ObservableCollection<Sales>(dgDailyTransactions.SelectedItems.Cast<Affaire>());
            }
    

    然后您在 SelectedSales 的 set 部分中的 ViewModel 中使用公式

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多