WPF Datagrid 列总和
WPF Datagrid column total sum
我有一个数据网格,我想汇总一列中的所有值。我想,要做到这一点,我需要逐行对该列中的值求和。但我无法访问行,因为 c# 中的 Datagrid.Rows 代码在 WPF 中不起作用。我访问总项目计数:
datagrid.Items.Count;
如何在 WPF 中实现数据网格列总和?
数据网格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">
数据网格文本列代码:
<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));
}
要获取要求和的列,请使用带有列索引的 .Columns
集合 属性。然后您可以在该列上使用 GetCellContent()
方法来访问其单元格。请记住,单元格的内容是 TextBlock
类型的对象,因此对其进行转换,获取其 Text
属性 并将值解析为 decimal
(或任何其他类型适合你的价值观)。
在你的例子中,你想要第八列(index = 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
并绑定网格的同一函数中计算总和,为什么不直接从 [=20= 计算总和呢? ]?你可以这样做(这与上面的代码非常相似,但直接来自 DataTable
而不是网格):
decimal sum = 0;
foreach (DataRow row in dbdataset.Rows) {
sum += Convert.ToDecimal(row["tutar"]);
}
注意:为什么要给 DataTable
起名字 dbdataset
?您应该考虑正确命名变量。
这里我通过绑定做了同样的事情。请参考我的示例代码,它可能会对您有所帮助。它将价格*数量相加并将总计放在总计列中。
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" ;
}
}
我刚刚在此处添加了更新查询,它将价格和数量相乘并计算总数。
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
}
我有一个数据网格,我想汇总一列中的所有值。我想,要做到这一点,我需要逐行对该列中的值求和。但我无法访问行,因为 c# 中的 Datagrid.Rows 代码在 WPF 中不起作用。我访问总项目计数:
datagrid.Items.Count;
如何在 WPF 中实现数据网格列总和?
数据网格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">
数据网格文本列代码:
<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));
}
要获取要求和的列,请使用带有列索引的 .Columns
集合 属性。然后您可以在该列上使用 GetCellContent()
方法来访问其单元格。请记住,单元格的内容是 TextBlock
类型的对象,因此对其进行转换,获取其 Text
属性 并将值解析为 decimal
(或任何其他类型适合你的价值观)。
在你的例子中,你想要第八列(index = 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
并绑定网格的同一函数中计算总和,为什么不直接从 [=20= 计算总和呢? ]?你可以这样做(这与上面的代码非常相似,但直接来自 DataTable
而不是网格):
decimal sum = 0;
foreach (DataRow row in dbdataset.Rows) {
sum += Convert.ToDecimal(row["tutar"]);
}
注意:为什么要给 DataTable
起名字 dbdataset
?您应该考虑正确命名变量。
这里我通过绑定做了同样的事情。请参考我的示例代码,它可能会对您有所帮助。它将价格*数量相加并将总计放在总计列中。
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" ;
}
}
我刚刚在此处添加了更新查询,它将价格和数量相乘并计算总数。
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
}