我想在DataGrid中显示如下信息                    所有物理课成绩
姓名      第一次月考    第二次月考 .... 期中考试 ....
张三        98            96       ....    94    ....
李四        88            78       ....    90    ....
王二        91            96       ....    88    ....相关的表的设计
(成绩表)
id       学号       课程代号     成绩     考试代号
001     02001          101        98        01
002     02002          101        88        01
003     02003          101        91        01
004     02001          101        96        02
005     02002          101        78        02
006     02003          101        96        02
 ...     .....        ......
115     02001          101        94        05
116     02002          101        90        05
117     02003          101        88        05
 ...     .....        .....(课程表)
id     课程代号     课程名称
001      101          物理
002      102          数学
...       ...         ....(考试名称表)
id    考试代号     考试名称
001     01         第一次月考
002     02         第二次月考
...    ...         .....
005     05         其中考试我的问题就是在成绩表中,每一个同学的每一门课程有好几次考试,在DataGrid中每条记录显示某个学生的某门课程的几次的考试成绩,由于几次考试是几条记录,我怎么让他在DataGrid中作为一条记录显示出来?是不是表这样设计不合理呢?请求高手指点!多谢了!说明详细思路或给个例子,感激不尽!

解决方案 »

  1.   

    简单
    我不考虑你表与表之间的复杂关系,你取出一个有[姓名],[考试名称],[成绩]的记录集(我估计这点你应该能用SQL语句搞定),然后
    取得(考试名称表)中[考试名称]的distinct查询后的结果集,追加到DataTable的Columns中
    这个DataTable用考生姓名做主键
    读取时这样处理
    (假定[姓名],[考试名称],[成绩]的顺序是0,1,2)
    while(reader.Read())
    {
    string name=reader.GetString(0);
    DataRow row=dataSet.xxxTable.FindBy[姓名](name);
    if(row==null)
    {
    row = dataSet.xxxTable.NewxxxRow();
    row.[姓名]=name;
    dataSet.xxxTable.AddxxxRow(row);
    }
    row[reader.GetString(1)]=reader.GetXXXX(2);
    }
      

  2.   

    张三        98            96       ....    94    ....
    怎么对应数据库中几条记录了?看不大明白其实你只要构建好需要的dataset就好了
      

  3.   

    我还是不懂你的意思!
    “你取出一个有[姓名],[考试名称],[成绩]的记录集(我估计这点你应该能用SQL语句搞定),”这一步没有问题。
    “取得(考试名称表)中[考试名称]的distinct查询后的结果集,追加到DataTable的Columns中”
    是不是distinct查询后的结果集作为DataTable的列名啊?也就是DataTable的结构就是:
    [姓名] [第一次月考] [第二次月考] .....[期中考试]....
    若是这样,那怎么追加啊?
    如果是这样了,那我们怎么把几条记录作为一条记录加到DataTable里
    比如数据是这样的:
    [姓名]  [考试名称]  [成绩]
    张三    第一次月考    98
    张三    第二次月考    95
    张三    期中考试      94加到DataTable中就是:
    [姓名] [第一次月考] [第二次月考] [期中考试]
    张三       98           95           94
    是用你给的那些代码吗?好象不行吧!
    请教了!
      

  4.   

    先建一个名字为GradeSet的数据集,并建一个表,名叫Grade,这个表只设一个字段[姓名],同时将这个字段设为主键,然后生成数据集.
    以下为查询代码(测试通过): private void button1_Click(object sender, EventArgs e)
            {
                this.m_GridView.DataSource = this.GetGradeSet();
                this.m_GridView.DataMember = "Grade";
            }
            public GradeSet GetGradeSet()
            {
                this.m_SqlConn.Open();
                IDbCommand cmd = this.m_SqlConn.CreateCommand();
                cmd.CommandText = "SELECT distinct exam from view_grade";
                GradeSet dataSet = new GradeSet();
                IDataReader reader=cmd.ExecuteReader();
                while(reader.Read())
                {
                    DataColumn column = new DataColumn();
                    column.ColumnName = string.Format("[{0}]", reader.GetString(0).Trim());
                    column.DataType = typeof(decimal);
                    dataSet.Grade.Columns.Add(column);
                }
                reader.Close();
                cmd.CommandText = "select name,exam,grade from view_grade";
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    string name = reader.GetString(0);
                    GradeSet.GradeRow  row = dataSet.Grade.FindBy__姓名_ (name);
                    if (row == null)
                    {
                        row = dataSet.Grade.NewGradeRow();
                        row["[姓名]"] = name;
                        dataSet.Grade.AddGradeRow(row);
                    }
                    row[string.Format("[{0}]",reader.GetString(1).Trim())] = reader.GetDecimal(2);
                }
                reader.Close();
                dataSet.AcceptChanges();
                this.m_SqlConn.Close();
                return dataSet;
            }
      

  5.   

    辛苦了,现在没时间看!刚随便看了一下有点看不懂,IDataReader 这个没用过,reader.Read()的reader也不知道什么,有空了再研究吧!这几天有点忙!多谢了jointan!