WPF表格控件动态表头
表格最方便的地方就是可以绑定数据源列表直接用来显示数据,但如果表头是不固定的就不太好实现这个,我这里采用的是动态类加动态插入表头的方法来实现,其中动态类的关键代码如下:
public class DynamicReportDataModel : DynamicObject
{
private string propertyName;
public string PropertyName
{
get {
return propertyName; }
set {
propertyName = value; }
}
Dictionary<string, object> dicProperty = new Dictionary<string, object>();
public Dictionary<string, object> DicProperty
{
get
{
return dicProperty;
}
}
public int Count
{
get
{
return dicProperty.Count;
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name;
return dicProperty.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (binder.Name == "Property")
{
dicProperty[PropertyName] = value;
}
else
{
dicProperty[binder.Name] = value;
}
return true;
}
}
动态插入表头的关键代码如下:
/// <summary>
/// 刷新班主任累计报表
/// </summary>
private void FreshHeadmasterTotalData(List<List<StudentStageResult>> list)
{
if (list == null || list.Count == 0)
{
return;
}
List<DynamicReportDataModel> items = new List<DynamicReportDataModel>();
List<string> pronames = new List<string>();
pronames.Add("Index");
pronames.Add("Name");
for (int j = 1; j <= list.Count; j++)//科目数
{
pronames.Add("AnswerCount" + j.ToString());
pronames.Add("RightCount" + j.ToString());
pronames.Add("Participation" + j.ToString());
pronames.Add("Accuracy1" + j.ToString());
pronames.Add("Accuracy2" + j.ToString());
pronames.Add("Threshold" + j.ToString());
}
List<HeadMasterReportModel> dynamics = new List<HeadMasterReportModel>();
int m = 1;
foreach(var student in GlobalConfig.reportStudentList)
{
HeadMasterReportModel dsm = new HeadMasterReportModel();
dsm.Index = m;
dsm.Name = student.studentName;
dsm.Items = new List<HeadMasterReportItemModel>();
for (int i = 0; i< list.Count; i++)
{
int count = 0;
if (list[i].Count > 0)
{
count = list[i].Select(o => o.questionNum).Max();
}
StudentStageResult studentStageResult = list[i].Select(o => o).Where(o => o.studentId == student.studentId).FirstOrDefault();
HeadMasterReportItemModel hmdrdi = new HeadMasterReportItemModel();
if (studentStageResult != null)
{
hmdrdi.AnswerCount = studentStageResult.answerNum.ToString();
hmdrdi.RightCount = studentStageResult.rightNum.ToString();
hmdrdi.Participation = MathUtil.CalculatePercent(studentStageResult.answerNum, count) + "%";
hmdrdi.Accuracy1 = MathUtil.CalculatePercent(studentStageResult.rightNum, studentStageResult.answerNum) + "%";
hmdrdi.Accuracy2 = MathUtil.CalculatePercent(studentStageResult.rightNum, count) + "%"; ;
hmdrdi.Threshold = Threshold;
}
dsm.Items.Add(hmdrdi);
}
dynamics.Add(dsm);
m++;
}
HeadMasterDayReportDatas = dynamics;
for (int i = 0; i < HeadMasterDayReportDatas.Count; i++)
{
dynamic ssm = new DynamicReportDataModel();
List<string> pis = new List<string>();
pis.Add(HeadMasterDayReportDatas[i].Index.ToString(