直接在数据库生成那样的格式不是更好吗?1、建立一张表,记录stuid
2、 读取所有不同的testid,在把每列通过动态sql添加到1步建立的标
3、将所有不同的stuid保存之1部建立的标
4循环sql表,执行update操作更新相对应的字段。
第二种方式,在程序中根据内容自动生成datagridview的column。

解决方案 »

  1.   

    太感谢了....
    不过,刚刚开始学习C# 和SQL ..动态表这个..不是很明白
    我自己去查查看能帮忙具体说下如何在程序中自动生成绑定dataGridView的column嘛?
      

  2.   

    不太清楚你SQL表的结构,不过推测StuID,TestID应该被作为表级主键
    确认这两列是主键是为了保证这表里的记录是按照 StuID,TestID的唯一组合做排序的,有这样的排序就方便了
    不是主键的话就自己按这两列排下序1、添加一个新的表XXX.tabels.add(new datatable)
    2、遍历原表的所有记录,找到所有的TestID,如果确定数目的话这步都不要了。先假设就只有两个个值。
    3、在新添加的表里添加几个列XXX.tabels(x).columns.add("列名"),
       几个列名分别是StuID,Test1,Test2
    4、由于原表中的记录是排好序的,你就很容易发现规律,写成伪代码的话就很容易看清楚
       新表.rows(0)item(1)=原表.rows(0).item.(2)
       新表.rows(0)item(2)=原表.rows(1).item.(2)
       新表.rows(1)item(1)=原表.rows(2).item.(2)
       新表.rows(1)item(2)=原表.rows(3).item.(2)
       新表.rows(2)item(1)=原表.rows(4).item.(2)
       新表.rows(2)item(2)=原表.rows(5).item.(2)
    一眼就清楚了,原表的列号永远是2,行号/2,商取整就是新表行号;(2-行号%2)就是新表列号
    不多写了,很容易一个循环就结束了,随便写写for(x=0;x<原表.rows.count;x++)
    {
         新表.rows(int(x/2))item(int(2-x%2))=原表.rows(x).item.(2)
    }很久不写C语法,一直在用VB。NET,代码可能有写错,哈,偶就不测试了你可以发现要写的东西很少
    添加表
    添加N个列
    写上这么个FOR如果TestID的值不止2个,那么有多少个就把FOR里面的2换成几就完了
      

  3.   

    DEBUG
    for(x=0;x <原表.rows.count-1;x++) 
      

  4.   

    不过,这样的话就不能保持原来的绑定了啊。
    就是说 在DataGuidView更改数据之后不能直接用 CommandBuilder生成命令直接update了。。
    手动upDate的话对我又是个挑战。。长长的一篇太感谢了,我去试试看~~
      

  5.   

    显然。你UPDATA前,把循环反过来用一下,就能把值赋回去也是一个FOR搞定的事情
    对付有规律的表还是比较方便的.for(x=0;x <原表.rows.count;x++) 

              原表.rows(x).item.(2)=新表.rows(int(x/2))item(int(2-x%2))
    } 当然假设是你没添加新行的前提下,嘿嘿各种情况各种应付
      

  6.   

    我想想,或者可以这么写,思路是先把原表CLEAR掉,保留表结构,删除所有数据,然后再把新表中的数据对应回原表
    这样就能不管新表有没有添加行了。
    反正我经常不管三七二十一的做事,太过复杂的事情咱就把他一次清理掉重来,呵呵,符合我的作风
    效率问题的说明见最后原表.clear
    datarow dr = 原表.newrow
    for x=0 to (新表.rows.count - 1) * 2
    { dr("StuID")=新表.rows(x/2).item(0) 
      dr("TestID")=新表.columns(X%2+1).columnname
      dr("Score ")=新表.rows(x/2).item(X%2+1)
      原表.rows.add=dr
    )没测试,所以边写说明边验证下思路:
    1、首先删了原表里所有的行
    2、还是假设是2个TestID的值,那么新表一行对应的就是原表中的两行,声明的X是原表中需要创建的行数
       所以FOR是从0到新表行数的两倍,因为是从0开始,所以减1后再乘2
       这样调用X的时候使用(x/2),那么X次和X+1次循环的时候,X/2的值是相同的,
       也就是说X次和X+1次循环的调用的是新表中的同一行
    3、循环中先声明一个新的数据行,并从“原表.newrow”中创建与该表具有相同架构的新DataRow
    4、原表中的新创建的这一行,StuID就是新表中的StuID
                            TestID是新表中列1或者列2的列名,那么也就是说偶数次循环的时候是列1,奇数次循环的时候是列2
                              所以得出X次循环,使用的列是(X%2+1)
                               Score 对应的是这X行,(X%2+1)列的值,所以Score =新表.rows(x/2).item(X%2+1)
    5、这一行值赋完了,就ADD到原表
    6、当然前提也是新表中的行是排序后的,排序这个不难吧dataview.Sort,按StuID排就好了
    7、还是没测试冷死了,休息完了继续工作
    8、诸多大虾肯定要批评我的做法效率太差,哈哈,我承认的,谁让我是菜鸟呢,嘿嘿
    9、我只是想提出解决问题有多种思路,有时候不一定全要靠调用现成的东西,自己写写算法其实很有趣
    10、希望能起到抛砖引玉的效果
    11、希望不要挨批。
    12、实在太冷了赶紧做完事赶紧回床。
    13、冷还是很冷。
      

  7.   

    继续DEBUG。哎~
    for x=0 to (新表.rows.count - 1) * 2 应该是
    for x=0 to (新表.rows.count - 1) * 2 -1
    也就是
    for x=0 to (新表.rows.count * 2 -1)还是因为是从0开始的