WPF C#Foreach获得下一个价值

时间:2013-07-17 01:35:23

标签: c# wpf foreach lambda records

我从数据库中得到了一个记录列表,我在我的CRUD类中检索过这样的记录(我正在使用实体框架,Model.question是我的类,里面有CRUD代码):

        public IList<Model.questionhint> GetRecords(int listTask, int listActivity)
    {
        IList<Model.questionhint> lstRecords = context.questionhints.ToList();
        return lstRecords.Where(a => a.TaskID == listTask && a.ActivityID == listActivity).ToList(); 

    }

这就是我从我的xaml.cs中调用它的方式:

 IList<Model.questionhint> lstQuestionHints = qh.GetRecords(taskID, activityID);

        StackPanel sp = new StackPanel();
        foreach (Model.questionhint qhm in lstQuestionHints)
        { //Code here
        }

但是在我的数据库表中,有一个列调用questionNo,一些记录具有相同的questionNo,activityID和taskID。一些记录具有相同的activityID和taskID但不同的questionNO。 这就是我的数据库表的样子:

enter image description here

目前,我可以很好地显示每个记录(使用foreach循环),但我想要的是将相同activityID,taskID和questionNo的记录组合在一行,现在每条记录都是逐行分开的这个:

enter image description here

我希望它像

我[回答]每天下午小睡一次

太阳[回答]没有绕地球移动。

我试图通过CRUD中的查询进行分组(我正在使用lambda表达式),但由于某些igrouping和数据整形的原因(这里不好)它失败了,有没有其他方法可以轻松地做到这一点?

我想到的是使用foreach循环,但是我可以得到questionNo的下一个值吗?例如在这个循环中,questionNo是1,我想检查下一个循环中的questionNo是否相同,如果不相同,我会将它添加到下一行,但如果它相同,我会将它添加到同一行。但我不熟悉面板和东西,因为我不熟悉编程以及WPF / C#。

非常感谢任何帮助/解决方案,提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我不会尝试在一个声明中这样做。您可能希望稍微预处理数据,因为每个问题(例如单行)都包含起始内容部分,选项部分和结束部分的重叠,跨越至少2条记录。

所以,创建一个代表问题一部分的模型,就像这样(只是一个例子):

public abstract class QuestionPart {}

public class ContentPart : QuestionPart {
 // holds the content
}

public class OptionsPart : QuestionPart {
 // holds the options and the answer
}

public class Question{
   public List<QuestionPart> questionParts {get; set;}
}

public class YourViewModel{
   public List<Question> questions {get; set;}
}

然后,Question个对象可以垂直堆叠,每个QuestionPart中的每个Question都可以被包裹(可能WrapPanel最适合这里)链接到一个问题

要将数据收集到问题集合中 - 您可以执行以下操作(我可能有错误 - 我还没有编译它,但这应该给你一个想法):

List<QuestionPart> questionParts = lstQuestionHints.SelectMany((r) => ExtractQuestionParts(r)); // ExtractQuestionParts returns a list of 1 or more question parts from each record

var groupedQuestionParts = questionParts.GroupBy((r) => r.QuestionNo);

var questions = groupedQuestionParts.Select((g) => return new Question(g.Key, g.ToList()));

既然您拥有Questions的集合,您可以在代码隐藏中创建控件(您似乎想要这样做),或者使用XAML和ItemsControls以及{{1}进行模拟等等...

希望它有所帮助。