日期:2014-05-20  浏览次数:20426 次

一个DataSet内进行数据操作的问题
现在在DataSet内已经得到一张数据表   举例如下

userID   Fields   Content
2             A             2Adata
2             B             2Bdata
3             A             3Adata
3             B             3bData
4             C             4cData
原始表就是这样了

想这样显示出来
UserId     A               B               C
2               2Adata   2Bdata
3               3Adata   3bData
4                                               4cData

根据Fields字段中不同字段数自动建立列,根据UserID的不同ID数建立行,最后填入数据
没有的数据就空或者默认一个数据
可以保证UserID和Fields的对应不会出现重复
希望能直接在DataSet里操作获得新的表,因为上面的原始数据来自XML和数据库,已经是整合过的了...
数据量不算特别大,顶多几百条,试问下如何用DataSet的到下面的表,或者有没有其他更好的一些办法~

感觉这应该是个老问题了,也感谢能提供任何源码~~~

------解决方案--------------------
看了一下 不会 呵呵 偶是新手 一起学习
------解决方案--------------------
交差表交给sql处理会容易一些,如果非得用代码处理,那么写循环是必不可少的了,慢慢写吧.
------解决方案--------------------
源码没有,思路有一个:

先New一个新的Table,再创建UserId列,然后遍历Fields字段,逐个创建列,
再遍历UserID字段,插入所有不重复的UserID数据,最后遍历Content,根据对应的UserID和Fields插入到指定的位置!
------解决方案--------------------
貌似没有简单的办法,DataTable不能用SQL的查询..
------解决方案--------------------
看看我的两个 DEMO,
这里,你可以选择方法 1 了,
如有可能,还是用 2 效率高些

1.
交叉表的简单实现2:使用前端程序实现
http://www.cnblogs.com/Jinglecat/archive/2007/05/24/757919.html

2.
交叉表的简单实现1:使用存储过程 http://www.cnblogs.com/Jinglecat/archive/2007/05/23/756427.html
------解决方案--------------------
直接的写法:

private DataTable cst(DataTable t)
{
DataTable r = new DataTable();
DataColumn c = t.Columns[ "userID "];
DataColumn d = t.Columns[ "Content "];
DataColumn e = t.Columns[ "Fields "];
if (e.DataType != typeof(string))
throw new Exception( "字段Fields必须是字符串。 ");

r.Columns.Add(new DataColumn( "userID ", c.DataType));
foreach (DataRow dr in t.Rows)
{
DataColumn fc = null;
int n = r.Columns.IndexOf((string)dr[ "Fields "]);
if (n < 0)
{
fc = new DataColumn((string)dr[ "Fields "], d.DataType);
r.Columns.Add(fc);
}
else
fc = r.Columns[n];
DataRow fr = null;
foreach (DataRow x in r.Rows)
if (x[0].Equals(dr[c]))
{
fr = x;
break;
}
if (fr == null)
{
fr = r.NewRow();
fr[0] = dr[c];
r.Rows.Add(fr);
}

fr[fc] = dr[d];
}
return r;
}
------解决方案--------------------