gpt4 book ai didi

c# - 如何处理组小计,例如WPF DataGrid 中的目标行?

转载 作者:可可西里 更新时间:2023-11-01 08:29:12 31 4
gpt4 key购买 nike

我正在实现一个 WPF DataGrid,其中包含具有许多关键数据的项目。项目按项目类别分组。

对于每个类别应该有:

  1. 在每个关键指标列中显示该列所有行总和的行。
  2. 不属于绑定(bind)到的数据源网格的目标行。目标行告诉每一列今年的目标是什么(例如要花多少钱)。

这些行应该始终位于每个组的顶部(排序过滤)。

我的第一个解决方案是将此数据放在组标题中。这不是一个好的解决方案,因为组标题不支持列。即它应该通过获取列宽来构建。

这可以做到,但当用户想要重新排序和隐藏列时,它会变得复杂。

DataGrid 使用 CollectionViewSource,因此它没有填充 C# 代码。基本上我正在扩展这个例子:http://msdn.microsoft.com/en-us/library/ff407126.aspx

谢谢和最好的问候 - matti

最佳答案

在我的一个项目中,我有一个黑客组合的 DataGrid,其中包含组小计行。我们并不关心您提出的一些问题,例如隐藏和排序列,所以我不确定是否可以为此进行扩展。我也意识到可能存在性能问题,这可能是大型集合的问题(我的窗口正在运行 32 个独立的 DataGrids - 哎哟)。但它与我见过的其他解决方案的方向不同,所以我想我会把它扔在这里看看它是否能帮助你。

我的解决方案包含两个主要部分:
1. 小计行不是主 DataGrid 中的行,而是单独的 DataGrid。我实际上在每个组中有 2 个额外的网格:1 个在标题中,仅在组折叠时显示,一个在 ItemsPresenter 下方。小计 DataGrids 的 ItemsSource 来自一个转换器,该转换器获取组中的项目并返回聚合 View 模型。小计网格的列与主网格完全相同(在 DataGrid_Loaded 中填写,但我确信它也可以在 xaml 中完成)。

            <GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander Background="Gray" HorizontalAlignment="Left" IsExpanded="True"
ScrollViewer.CanContentScroll="True">
<Expander.Header>
<DataGrid Name="HeaderGrid" ItemsSource="{Binding Path=., Converter={StaticResource SumConverter}}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="25 0 0 0" PreviewMouseDown="HeaderGrid_PreviewMouseDown">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
</DataGrid>
</Expander.Header>
<StackPanel>
<ItemsPresenter/>
<DataGrid Name="FooterGrid" ItemsSource="{Binding ElementName=HeaderGrid, Path=ItemsSource, Mode=OneWay}"
Loaded="DataGrid_Loaded" HeadersVisibility="Row"
Margin="50 0 0 0">
<DataGrid.Style>
<Style TargetType="DataGrid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander}, Path=IsExpanded}"
Value="False">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid>
</StackPanel>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>


2. 那么问题是如何让所有的DataGrids 表现得好像它们是一个单一的网格。我通过在一个名为 DataGridSharedSizeTextColumn 的类中子类化 DataGridTextColumn(在这种情况下我们只有文本,但其他列类型也应该工作)来处理这个问题,该类模仿 SharedSizeGroup 的行为网格类。它有一个带有组名的字符串依赖属性,并跟踪同一组中的所有列。当一列中的 Width.DesiredValue 发生变化时,我会更新所有其他列中的 MinWidth 并使用 DataGridOwner.UpdateLayout() 强制进行更新。此类还涵盖列重新排序,并在 DisplayIndex 更改时进行组范围内的更新。我认为此方法也适用于任何其他列属性,只要它具有 setter。

选择、复制等还有其他烦人的事情要解决。但事实证明,使用 MouseEntered 和 MouseLeave 事件以及使用自定义复制命令可以很容易地处理这些问题。

关于c# - 如何处理组小计,例如WPF DataGrid 中的目标行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652203/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com