C# 计算列的Datagrid组总计并将其显示在组标题中
有很多Datagrid分组教程和问题,但我似乎根本无法让我的转换器计算我的项目总数 情况是,我有一个datagrid,它显示有一个时间列的项,时间列是完成任务的小时数,这些项按任务完成的日期分组-见下文 因此,要显示的总数是1/8/16组标题中的7.5 我相信我需要使用Linq来查询ObservaleCollection,使用group属性作为过滤器,但是我很难知道该做什么以及如何做。传递给转换器的集合中的项似乎仅由组项传递,而不是由下面的项传递,这就像属于该组的项不在传递的集合中一样 任何提示都很感激,如果我错过了任何需要的代码,我会补充清楚,我不太理解这一点-提前感谢 这是我的转换器代码C# 计算列的Datagrid组总计并将其显示在组标题中,c#,wpf,linq,datagrid,C#,Wpf,Linq,Datagrid,有很多Datagrid分组教程和问题,但我似乎根本无法让我的转换器计算我的项目总数 情况是,我有一个datagrid,它显示有一个时间列的项,时间列是完成任务的小时数,这些项按任务完成的日期分组-见下文 因此,要显示的总数是1/8/16组标题中的7.5 我相信我需要使用Linq来查询ObservaleCollection,使用group属性作为过滤器,但是我很难知道该做什么以及如何做。传递给转换器的集合中的项似乎仅由组项传递,而不是由下面的项传递,这就像属于该组的项不在传递的集合中一样 任何提
public class GroupTotalsToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is ReadOnlyObservableCollection<Object>)
{
var items = (ReadOnlyObservableCollection<Object>)value;
Decimal total = 0;
foreach (GroupItem gi in items)
{
//sometype of query to add up timespent
}
return total.ToString();
}
return "";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}
公共类GroupTotalsToStringConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
if(值为ReadOnlyObservableCollection)
{
变量项=(ReadOnlyObservableCollection)值;
小数总数=0;
foreach(项目中的GroupItem gi)
{
//某种类型的查询,用于添加所花费的时间
}
返回total.ToString();
}
返回“”;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值;
}
}
我的Datagrid xmal是
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="271" ItemsSource="{Binding}"
Name="enteredticketsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="435"
Background="Black" RowBackground="Black"
AlternatingRowBackground="DarkBlue"
MouseDoubleClick="enteredticketsDataGrid_MouseDoubleClick" Cursor="Arrow"
IsReadOnly="True" ToolTip="Select the Date From and To and Refresh the grid. Dounle click on a return ticket to open the Edit screen for that ticket.">
<DataGrid.Columns>
<DataGridTextColumn x:Name="ticketDateColumn" Binding="{Binding Path=TicketDate, StringFormat=\{0:dd/MM/yy\} }" Header="Date" Width="Auto" />
<DataGridTextColumn x:Name="statusColumn" Binding="{Binding Path=status}" Header="status" Width="SizeToHeader" />
<DataGridTextColumn x:Name="numberColumn" Binding="{Binding Path=number}" Header="number" Width="Auto" />
<DataGridTextColumn x:Name="timespentColumn1" Binding="{Binding Path=timespent}" Header="Time" Width="SizeToHeader" />
<DataGridTextColumn x:Name="subjectColumn" Binding="{Binding Path=subject}" Header="Subject" Width="Auto" />
</DataGrid.Columns>
<DataGrid.GroupStyle>
<!-- Style for groups at top level. -->
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Margin" Value="0,0,0,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="False" Background="#FF112255" BorderBrush="#FF002255" Foreground="#FFEEEEEE" BorderThickness="1,1,1,5">
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name, Converter={StaticResource StringToDateTimeConverter }}" Margin="5,0,0,0" Width="100"/>
<TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/>
<!--<TextBlock FontWeight="Bold" Text="Test"/>-->
<TextBlock Text="{Binding Path=Text, Converter={StaticResource GroupTotalsToStringConverter}}"></TextBlock>
</DockPanel>
</Expander.Header>
<Expander.Content>
<ItemsPresenter />
</Expander.Content>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
试试这个:
xaml
这会将ItemsCollection作为值提供给转换器。具体的数据类型属于您的ItemsSource,可以通过ConverterCall上的调试找到。谢谢您现在在火车上,请稍后再试……然后回来回答……那么我发送的是什么集合,仅一个组标题项目?为什么更改会将项目发送到源?路径=项目会提供组中的所有项目。然后,您可以计算小时总数(或任何您想要的)。我不知道值(在转换器中)是否是ObservableCollection或List或其他CollectionType。。。但你会明白的。
<Expander.Header>
<DockPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Name, Converter={StaticResource StringToDateTimeConverter }}" Margin="5,0,0,0" Width="100"/>
<TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/>
<TextBlock Text="{Binding Path=Items, Converter={StaticResource GroupTotalsToStringConverter}, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
</Expander.Header>