Отображение ListView в виде сводных данных (XAML, C #) - PullRequest
0 голосов
/ 01 апреля 2019

Я отобразил данные внутри ListView:

<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>

Это выглядит так:

ReadTime | Position |PosCou
---------------------------
01022019 |  PosA    | 10
01022019 |  PosB    | 20
01022019 |  PosC    | 30
...
01032019 |  PosA    | 12
01032019 |  PosB    | 21
01032019 |  PosC    | 33

Теперь я хочу displayed exactly the same data, но на вид, как Pivot Data:

      |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);
        }

IEnumerable<User> listUsers:

public class User
{
 public string ReadTime { get; set; }
 public string Id { get; set; }
 public string LName { get; set; }
 public string FName { get; set; }
 public string Position { get; set; }
 public string City { get; set; }
 public string Country { get; set; }
 public string Car { get; set; }
}

1 Ответ

2 голосов
/ 01 апреля 2019

Как я могу это сделать?

Вы используете тип, представляющий строку в сводном представлении, и преобразуете свою исходную коллекцию.Если число столбцов является динамическим, вы можете использовать DataTable.

Если задано IEnumerable<User>, следующий метод должен вернуть вам сводное значение DataTable:

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;
}

Youзатем можно заменить ListView на DataGrid, который автоматически генерирует динамические столбцы, или явно создать столбцы самостоятельно в представлении:

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