【问题标题】:WPF Datagrid column total sumWPF Datagrid 列总和
【发布时间】:2018-01-02 11:03:12
【问题描述】:

我有一个数据网格,我想总结一列中的所有值。我认为,要做到这一点,我需要逐行汇总该列中的值。但我无法访问行,因为 c# 中的 Datagrid.Rows 代码在 WPF 中不起作用。我通过以下方式访问总项目数:

datagrid.Items.Count;

如何在 WPF 中进行数据网格列总和?

Datagrid xaml 代码:

<DataGrid BorderThickness="0" Name="grid_lab" RowHeight="25" IsReadOnly="True"  CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="True" CanUserResizeRows="False" AutoGenerateColumns="False" ColumnWidth="*" HorizontalGridLinesBrush="#FFDCDBDB" VerticalGridLinesBrush="#FFDCDBDB" HeadersVisibility="Column" VerticalAlignment="Top" Background="{x:Null}" MouseLeftButtonUp="grid_lab_MouseLeftButtonUp">

Datagrid 文本列代码:

<DataGridTextColumn Binding="{Binding Path=tutar}" Header="Tutar" MaxWidth="50">
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="TextBlock">
                                    <Setter Property="VerticalAlignment" Value="Center"/>
                                    <Setter Property="Padding" Value="5,0,0,0"/>
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>

加载的用户控件中的总和代码:

            decimal sum = 0m;
        for (int i = 0; i < grid_lab.Items.Count - 1; i++)
        {
            sum += (decimal.Parse((grid_lab.Columns[7].GetCellContent(grid_lab.Items[i]) as TextBlock).Text));
        }

【问题讨论】:

  • @为什么不使用模型并将总计绑定到列,而不是从网格计算。

标签: c# wpf wpfdatagrid


【解决方案1】:

要获取要求和的列,请将.Columns 集合属性与列的索引结合使用。然后您可以在列上使用GetCellContent() 方法来访问其单元格。请记住,单元格的内容是 TextBlock 类型的对象,因此请转换它,获取其 Text 属性并将值解析为 decimal(或任何其他适合您的值的类型)。

在你的情况下,你想要第八列(索引 = 7),你可以试试这个:

decimal sum = 0m;
for (int i = 0; i < grid_lab.Items.Count - 1; i++) {
    sum += (decimal.Parse((grid_lab.Columns[7].GetCellContent(grid_lab.Items[i])as TextBlock).Text));
}

注意我们循环到Items.Count - 1,因为最后一项是占位符。

或者,您可以使用存储绑定对象集合的ItemsSource 属性,然后将每个项目转换为您要绑定的类型。

您正在绑定到DataTable,并且正在计算tutar 列的总数。您可以使用下面的代码来获取总数:

decimal sum = 0m;
foreach (DataRowView row in grid_lab.ItemsSource) {
    sum += (decimal)row["tutar"];
}

但是,既然您是在从数据库中获取DataTable 并绑定网格的同一个函数中计算总和,那么为什么不直接从DataTable 计算总和呢?您可以这样做(这与上面的代码非常相似,但直接来自DataTable 而不是网格):

decimal sum = 0;
foreach (DataRow row in dbdataset.Rows) {
    sum += Convert.ToDecimal(row["tutar"]);
}

注意:为什么将DataTable 命名为dbdataset?您应该考虑正确命名变量。

【讨论】:

  • 我遇到了一个错误。 WpfApplication1.exe 中出现“System.NullReferenceException”类型的未处理异常附加信息:对象引用未设置为对象的实例。
  • 糟糕!我忘记了循环中的-1。请参阅我的更新答案。如果您将绑定的对象转换为您要绑定的类型,我还添加了一个更好的解决方案。
  • 我已经创建了一个工作测试项目并从那里为您复制了代码。两种解决方案都应该有效。你试过第二个吗?您需要发布网格代码和填充它的代码,以便我们查看并帮助您调试问题。
  • 这还不够。我需要整个网格 XAML 和填充它的代码,或者至少需要将它绑定到的对象。
  • 我测试了你的代码并且它有效。无论如何,我更新了我的答案以反映您的代码,所以请检查一下。
【解决方案2】:

在这里我通过使用绑定做了同样的事情。请参考我的示例代码,它可能会对您有所帮助。它将价格*数量相加,并将总数放在总计列中。

Products.xaml

  <DataGrid AutoGenerateColumns="False" Height="150" HorizontalAlignment="Left" Margin="108,169,0,0" x:Name="dataGrid1" VerticalAlignment="Top" Width="365" ItemsSource="{Binding}" DataGridCell.Selected="dataGrid1_Selected">
          <DataGrid.Columns>   
           <DataGridTextColumn Header="Product Price" Binding="{Binding productprice}"/>
           <DataGridTextColumn Header="Product QTY" Binding="{Binding productqty}" />
           <DataGridTextColumn Header="Total" Binding="{Binding total}" x:Name="total" />
          </DataGrid.Columns> 
    </DataGrid>

假设您的 xaml 视图中有一个添加按钮。

Products.xaml.cs

private void addButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                NpgsqlConnection con = new NpgsqlConnection("Server=00.0.0.00;Port=1111;Database=TEST_DB;User Id=postgres;Password=****;");
                con.Open();
                NpgsqlCommand cmd = new NpgsqlCommand("insert into Product(productprice,productqty)values('"+ prodprice.Text.ToString() + "','" + prodqty.Text.ToString() + "')", con);
                NpgsqlCommand cmd2 = new NpgsqlCommand("update Product set total=productprice*productqty", con);
                cmd.CommandType = CommandType.Text;
                cmd.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();
                con.Close();
                errorMessage.Text = "Item Added Successfully";
                prodprice.Text = prodqty.Text = "";
                NpgsqlCommand cmd1 = new NpgsqlCommand("select *from Product", con);
                NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(cmd1);
                DataTable dt = new DataTable("Product");
                adapter.Fill(dt);
                dataGrid1.ItemsSource = dt.DefaultView;
            }
            catch (NpgsqlException)
            {
                errorMessage.Text ="Enter Valid Data" ;
            }
        }

我刚刚在此处添加了更新查询,它将价格和数量相乘并计算总数。

【讨论】:

    【解决方案3】:
    int sum = 0;
    for (int i = 0; i < datagrid1.Items.Count; i++)
    {
          dynamic s = datagrid1.Items[i]; // select row i in datagrid
          sum += s.NamteOfTheColumnInDataBase; // access to special field(column) of row
    }
    

    【讨论】:

    • 考虑添加有关您的代码如何回答问题的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2013-05-17
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多