直接在数据库生成那样的格式不是更好吗?1、建立一张表,记录stuid
2、 读取所有不同的testid,在把每列通过动态sql添加到1步建立的标
3、将所有不同的stuid保存之1部建立的标
4循环sql表,执行update操作更新相对应的字段。
第二种方式,在程序中根据内容自动生成datagridview的column。
2、 读取所有不同的testid,在把每列通过动态sql添加到1步建立的标
3、将所有不同的stuid保存之1部建立的标
4循环sql表,执行update操作更新相对应的字段。
第二种方式,在程序中根据内容自动生成datagridview的column。
解决方案 »
- C# 调用C++做的WEN服务
- 一个按钮直接打开本地文件
- 安装SQL sever2005的问题 大家帮我看一下
- 记事本中的一段代码!!!
- 如何用C#(vs2005)实现,打开一个文件时使用已存在的进程来处理,而不再建立一个新进程
- FileStream.Seek方法为什么不起作用
- 各位大虾帮忙看看关于Socket的问题????????
- 微软Tech·Ed 2004 上海--第1天
- C# 串口打印设置字体大小
- 现在想写几组商务逻辑库,希望既能被WinForm调用,也能被ASP.NET调用
- 高分跪求DotNetHelper V 0.9.5.1三层结构代码生成器
- c#.net能写木马吗?如果可以那写了之后怎么运行?可以脱离Framework运行吗
不过,刚刚开始学习C# 和SQL ..动态表这个..不是很明白
我自己去查查看能帮忙具体说下如何在程序中自动生成绑定dataGridView的column嘛?
确认这两列是主键是为了保证这表里的记录是按照 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换成几就完了
for(x=0;x <原表.rows.count-1;x++)
就是说 在DataGuidView更改数据之后不能直接用 CommandBuilder生成命令直接update了。。
手动upDate的话对我又是个挑战。。长长的一篇太感谢了,我去试试看~~
对付有规律的表还是比较方便的.for(x=0;x <原表.rows.count;x++)
{
原表.rows(x).item.(2)=新表.rows(int(x/2))item(int(2-x%2))
} 当然假设是你没添加新行的前提下,嘿嘿各种情况各种应付
这样就能不管新表有没有添加行了。
反正我经常不管三七二十一的做事,太过复杂的事情咱就把他一次清理掉重来,呵呵,符合我的作风
效率问题的说明见最后原表.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、冷还是很冷。
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开始的