我有一个Employee
课程:
class Employee
{
public string Name { get; set; }
public string SurName { get; set; }
public int Rest{ get; set; }
public int Worked { get; set; }
public List<int> PerShift= new List<int>();
}
在我的数据库中,我保存一名员工在第一班工作多少次,第二班等多少次。然后在我的数据网格中,我想看看每位员工总共工作多少次,他休息多少天以及多少天他每班工作几天。问题是移位号是由用户设置的,所以我必须以编程方式添加这些列
<DataGrid Name="EmployeesStatsDatagrid"
Grid.Row="1"
IsReadOnly="True"
CanUserAddRows="False" CanUserReorderColumns="False"
Grid.ColumnSpan="4"
Grid.Column="0"
IsSynchronizedWithCurrentItem="True"
CanUserDeleteRows="False"
CanUserResizeRows="False"
AutoGenerateColumns="False"
VerticalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Surname" Binding="{Binding SureName}" />
<DataGridTextColumn Header="Rest" Binding="{Binding Rest}" />
<DataGridTextColumn Header="Δούλεψε" Binding="{Binding Worked}" />
</DataGrid.Columns>
</DataGrid>
然后我添加额外的列
for (int i = 0; i < Collections.ShiftsCollection.Count; i++)
{
DataGridTextColumn textColumn = new DataGridTextColumn();
textColumn.Header = Collections.ShiftsCollection[i].ShiftName.ToUpper();
//textColumn.Binding = new Binding(Collections.ShiftsCollection[i].ShiftName);
EmployeesStatsDatagrid.Columns.Add(textColumn);
}
列已正确设置,我创建了一个Employee
列表和绑定工作名称,姓氏,工作和休息,但如何将额外列绑定到List<int> PerShift
?有任何想法吗?或者我应该以不同的方式实施它?
例如,在这种情况下,我有两个班次,上午和下午,第一个员工PerShift列表是{4,0},第二个是{0,1}有没有办法让列中的这些值绑定?我在这种情况下对它们进行了硬编码,但如果我对列进行排序,则会丢失值。
答案 0 :(得分:1)
您可以使用ExpandoObject。以相同的方式添加多余的列,然后按如下所示创建DataGrid.ItemsSource对象列表:
var all_items = new List<object>();
for (int i = 0; i <= MyData.Count-1; i++)
{
dynamic item = new System.Dynamic.ExpandoObject();
item.Name = MyData[i].Name;
item.Surname = MyData[i].Surname;
item.Rest = MyData[i].Rest;
item.Worked = MyData[i].Worked;
for (int k = 0; k <= Collections.ShiftsCollection.Count - 1; k++)
{
item = ExtendExpando(item, Collections.ShiftsCollection[k].ShiftName, Collections.ShiftsCollection[k].Value);
// or whatever corresponding value instead of Collections.ShiftsCollection[k].Value
}
all_items.Add(item);
}
EmployeesStatsDatagrid.ItemsSource = all_items;
其中ExtendExpando函数可以按以下方式实现:
public static object ExtendExpando(object OldExpandoObject, string NewProperty, object NewValue)
{
var ex = (IDictionary<string, object>)OldExpandoObject;
ex.Add(new KeyValuePair<string, object>(NewProperty, NewValue));
dynamic output = ex;
return output;
}
注意:我已使用Visual Basic而非C#成功测试了此代码,您可能需要进行一些小的修改。