显示为数据透视数据的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" />