问题描述
Sql中列表为StuIDTestIDScoreStu1test160stu1test270stu2test180stu2test290想让它显示为StuIDTest1Test2stu16070stu28090想要dataGirdview与原始dataset保持绑定,好方便直接修改数据后更新请教如何实现,SQLdataView什么方法都好,使用其它控件也可以先谢过了
解决方案
解决方案二:
自己顶下,在线求解
解决方案三:
直接在数据库生成那样的格式不是更好吗?1、建立一张表,记录stuid2、读取所有不同的testid,在把每列通过动态sql添加到1步建立的标3、将所有不同的stuid保存之1部建立的标4循环sql表,执行update操作更新相对应的字段。第二种方式,在程序中根据内容自动生成datagridview的column。
解决方案四:
太感谢了....不过,刚刚开始学习C#和SQL..动态表这个..不是很明白我自己去查查看能帮忙具体说下如何在程序中自动生成绑定dataGridView的column嘛?
解决方案五:
不太清楚你SQL表的结构,不过推测StuID,TestID应该被作为表级主键确认这两列是主键是为了保证这表里的记录是按照StuID,TestID的唯一组合做排序的,有这样的排序就方便了不是主键的话就自己按这两列排下序1、添加一个新的表XXX.tabels.add(newdatatable)2、遍历原表的所有记录,找到所有的TestID,如果确定数目的话这步都不要了。先假设就只有两个个值。3、在新添加的表里添加几个列XXX.tabels(x).columns.add("列名"),几个列名分别是StuID,Test1,Test24、由于原表中的记录是排好序的,你就很容易发现规律,写成伪代码的话就很容易看清楚新表.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换成几就完了
解决方案六:
DEBUGfor(x=0;x<原表.rows.count-1;x++)
解决方案七:
不过,这样的话就不能保持原来的绑定了啊。就是说在DataGuidView更改数据之后不能直接用CommandBuilder生成命令直接update了。。手动upDate的话。。。对我又是个挑战。。长长的一篇。。。太感谢了,我去试试看~~
解决方案八:
显然。。。。你UPDATA前,把循环反过来用一下,就能把值赋回去。。。也是一个FOR搞定的事情对付有规律的表还是比较方便的.for(x=0;x<原表.rows.count;x++){原表.rows(x).item.(2)=新表.rows(int(x/2))item(int(2-x%2))}当然假设是你没添加新行的前提下,嘿嘿。。。各种情况各种应付
解决方案九:
我想想,或者可以这么写,思路是先把原表CLEAR掉,保留表结构,删除所有数据,然后再把新表中的数据对应回原表这样就能不管新表有没有添加行了。。。。反正我经常不管三七二十一的做事,太过复杂的事情咱就把他一次清理掉重来,呵呵,符合我的作风。。。效率问题的说明见最后。。。原表.cleardatarowdr=原表.newrowforx=0to(新表.rows.count-1)*2{dr("StuID")=新表.rows(x/2).item(0)dr("TestID")=新表.columns(X%2+1).columnnamedr("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”中创建与该表具有相同架构的新DataRow4、原表中的新创建的这一行,StuID就是新表中的StuIDTestID是新表中列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、冷。。。还是很冷。。。。
解决方案十:
继续DEBUG。。。。哎~forx=0to(新表.rows.count-1)*2应该是forx=0to(新表.rows.count-1)*2-1也就是forx=0to(新表.rows.count*2-1)还是因为是从0开始的。。。