显示为数据透视数据的ListView(XAML,C#)

显示为数据透视数据的ListView(XAML,C#),c#,wpf,xaml,listview,pivot,C#,Wpf,Xaml,Listview,Pivot,我已在列表视图中显示数据: <ListView ItemsSource="{Binding Path=ListUsers}" > <ListView.View> <GridView> <GridViewColumn Header="ReadTime" DisplayMemberBinding="{Binding ReadTime}" /> <GridViewColumn Header

我已在
列表视图中显示数据

<ListView ItemsSource="{Binding Path=ListUsers}" >
    <ListView.View>
        <GridView>
         <GridViewColumn Header="ReadTime" DisplayMemberBinding="{Binding ReadTime}" />
         <GridViewColumn Header="Stanowisko" DisplayMemberBinding="{Binding Position}" />
         <GridViewColumn Header="Counter" DisplayMemberBinding="{Binding PosCou}" />
        </GridView>
    </ListView.View>
</ListView>
现在我想
显示完全相同的数据
,但在视图中类似于
透视数据

      |01022019 | 01032019 | ...
---------------------------------
PosA  |  10     |   12     | ...
PosB  |  20     |   21     | ...
PosC  |  30     |   33     | ...
...
我怎么能做到

我的Linq查询:

 public IList<GroupUser> GetList(ICollection<User> UserList)
        {
            GroupUsersList = UserList
                            .GroupBy(x => new { x.ReadTime, x.Position })
                            .Select(group => new GroupUser
                                            {
                                                ReadTime = group.Key.ReadTime,
                                                Position = group.Key.Stanowisko,
                                                PosCou = group.Count()
                                            })
                            .ToList();
            return new List<GroupUser>(GroupUsersList);
        }
我怎么能做到

您可以使用表示数据透视视图中的行的类型,并转换源集合。如果列数是动态的,则可以使用
DataTable

给定一个
IEnumerable
,以下方法应返回数据透视表

private static DataTable TransformData(IEnumerable<User> listUsers)
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(new DataColumn("Position"));

    Dictionary<string, DataRow> positions = new Dictionary<string, DataRow>();
    foreach (var user in listUsers)
    {
        DataColumn column = dataTable.Columns.OfType<DataColumn>().FirstOrDefault(c => c.ColumnName == user.ReadTime);
        if (column == null)
        {
            column = new DataColumn(user.ReadTime);
            dataTable.Columns.Add(column);
        }

        DataRow row;
        if (!positions.TryGetValue(user.Position, out row))
        {
            row = dataTable.NewRow();
            dataTable.Rows.Add(row);
            row[0] = user.Position;
            positions.Add(user.Position, row);
        }

        object o = row[column];
        int posCou = o == DBNull.Value ? 0 : Convert.ToInt32(o);
        row[column] = posCou + user.PosCou;
    }

    return dataTable;
}
我怎么能做到

您可以使用表示数据透视视图中的行的类型,并转换源集合。如果列数是动态的,则可以使用
DataTable

给定一个
IEnumerable
,以下方法应返回数据透视表

private static DataTable TransformData(IEnumerable<User> listUsers)
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(new DataColumn("Position"));

    Dictionary<string, DataRow> positions = new Dictionary<string, DataRow>();
    foreach (var user in listUsers)
    {
        DataColumn column = dataTable.Columns.OfType<DataColumn>().FirstOrDefault(c => c.ColumnName == user.ReadTime);
        if (column == null)
        {
            column = new DataColumn(user.ReadTime);
            dataTable.Columns.Add(column);
        }

        DataRow row;
        if (!positions.TryGetValue(user.Position, out row))
        {
            row = dataTable.NewRow();
            dataTable.Rows.Add(row);
            row[0] = user.Position;
            positions.Add(user.Position, row);
        }

        object o = row[column];
        int posCou = o == DBNull.Value ? 0 : Convert.ToInt32(o);
        row[column] = posCou + user.PosCou;
    }

    return dataTable;
}

你在哪里挣扎?你尝试过什么?你在使用MVVM吗?你能直接在数据库中透视数据吗?是的,MVVM,我有Linq查询(请参阅更新)你在哪里挣扎?你尝试过什么?你在使用MVVM吗?你能直接在数据库中透视数据吗?是的,MVVM,我在MVVM中有Linq查询(请参阅更新)以
connect ListView
我有
ICollection ListUsers{get;set;}
…现在如何处理
DataTable.DefaultView
?只需从属性中返回
DataView
IEnumerable
public DataView ListUsers=>DataTable.DefaultView
;我得到了错误:
非静态字段需要对象引用…
得到了,现在它是针对行
int posCou=o==DBNull…
=>
值对于Int32太大或太小。
那么调试代码时
o
的值是多少?还请注意,我提供了一个示例。因此,这不是一个代码编写服务…在我的MVVM中连接ListView
我做了
ICollection ListUsers{get;set;}
…现在如何处理
DataTable.DefaultView
?只需从属性返回一个
DataView
或一个
IEnumerable
公共DataView ListUsers=>DataTable.DefaultView
;我得到了错误:
非静态字段需要对象引用…
得到了,现在它是针对行
int posCou=o==DBNull…
=>
值对于Int32太大或太小。
那么调试代码时
o
的值是多少?还请注意,我提供了一个示例。所以不是一个代码编写服务。。。
private static DataTable TransformData(IEnumerable<User> listUsers)
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(new DataColumn("Position"));

    Dictionary<string, DataRow> positions = new Dictionary<string, DataRow>();
    foreach (var user in listUsers)
    {
        DataColumn column = dataTable.Columns.OfType<DataColumn>().FirstOrDefault(c => c.ColumnName == user.ReadTime);
        if (column == null)
        {
            column = new DataColumn(user.ReadTime);
            dataTable.Columns.Add(column);
        }

        DataRow row;
        if (!positions.TryGetValue(user.Position, out row))
        {
            row = dataTable.NewRow();
            dataTable.Rows.Add(row);
            row[0] = user.Position;
            positions.Add(user.Position, row);
        }

        object o = row[column];
        int posCou = o == DBNull.Value ? 0 : Convert.ToInt32(o);
        row[column] = posCou + user.PosCou;
    }

    return dataTable;
}
<DataGrid ItemsSource="{Binding Path=DataTable.DefaultView}" IsReadOnly="True" />