将数据复制到嵌套列表

时间:2015-02-05 11:19:28

标签: .net sql-server silverlight nested-lists

我在数据库中有一些学生的记录,我需要在嵌套网格中向用户显示这些数据。数据就像

姓名 - 年龄 - 主题 - Obt.Marks - TotalMarks

Ali      20     Maths           80             100
Ali      20     Literature      60             100
Ali      20     English         80             100
Ahmad    20     Maths           70             100
Ahmad    20     Literature      60             100
Ahmad    20     English         90             100
John     20     Maths           80             100
John     20     Literature      80             100
John     20     English         80             100

我已经嵌套列表,其中包含学生姓名,年龄和每个学生的标记和科目列表。但我不明白如何将数据从数据库复制到列表而不重复任何学生。

任何形式的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

这听起来像是一个经典的主/细节场景,您可以在其中设置两个网格,一个包含学生数据,另一个包含标记。在学生网格中选择行时,标记网格将填充与所选学生相关的数据。 还有另一种选择。您可以使用已弃用的DataGrid并绑定到由DataRelation连接的DataTable,以实现嵌套的UI。您必须专门将此控件添加到工具箱中,因为您只会显示较新的DataGridView。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dtStudents = new DataTable("Students");
        dtStudents.Columns.Add(new DataColumn("StudentID", typeof(Int32)));
        dtStudents.Columns.Add(new DataColumn("Name", typeof(string)));
        dtStudents.Columns.Add(new DataColumn("Age", typeof(Int32)));

        DataTable dtMarks = new DataTable("Marks");
        dtMarks.Columns.Add(new DataColumn("StudentID", typeof(Int32)));
        dtMarks.Columns.Add(new DataColumn("Mark", typeof(Int32)));

        DataRow dr = dtStudents.NewRow();
        dr["StudentID"] = 100;
        dr["Name"] = "Bob";
        dr["Age"] = 20;
        dtStudents.Rows.Add(dr);

        dr = dtStudents.NewRow();
        dr["StudentID"] = 200;
        dr["Name"] = "Sally";
        dr["Age"] = 10;
        dtStudents.Rows.Add(dr);

        dr = dtStudents.NewRow();
        dr["StudentID"] = 300;
        dr["Name"] = "Joe";
        dr["Age"] = 30;
        dtStudents.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 100;
        dr["Mark"] = 80;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 100;
        dr["Mark"] = 70;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 100;
        dr["Mark"] = 60;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 200;
        dr["Mark"] = 80;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 200;
        dr["Mark"] = 80;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 300;
        dr["Mark"] = 75;
        dtMarks.Rows.Add(dr);

        dr = dtMarks.NewRow();
        dr["StudentID"] = 100;
        dr["Mark"] = 99;
        dtMarks.Rows.Add(dr);

        DataSet ds = new DataSet();
        ds.Tables.Add(dtStudents);
        ds.Tables.Add(dtMarks);

        DataRelation drStudentId = new DataRelation(
            "StudentID_Relation", ds.Tables[0].Columns["StudentID"],
            ds.Tables[1].Columns["StudentID"], true);

        ds.Relations.Add(drStudentId);
        dataGrid1.DataSource = ds.Tables["Students"];           

    }
}

你得到这样的用户界面:" +"行标题中的标志以扩展为子数据。 Parent data shown collapsed Expanding the parent row And finally the child rows