DataBind之前操控DataTable
操控DataTable实现跨表查询和统计文章数目
真正跟GridView和DataList组件绑定的,并不是DataSet,而是存储在DataSet中的DataTable。因此,即使没有DataSet,自己创建DataTable用于数据绑定也是可行的。
在根据网站分类统计文章总数的时候,发现了一个问题,由于既需要在网站分类表中读取网站分类的名称(ClassName)和旗帜(ClassFlag),有需要在文章表中统计同一个文章旗帜(ClassFlag)的文章数目(Count(id) group by ClassFlag),这两个视图无论如何都不能在同一个sql语句中实现,又不想用到储存过程,于是只能借助与DataTable进行程序层面的逻辑处理了。
首先是建立一个包含了两个视图的数据表DataTable t,然后添加必须的DataColumn,随后在循环中根据两个视图中ClassFlag相等的关系,进行匹配选择,创建DataRow,加入DataTable。例如:
DataTable t = new DataTable("Aim");
t.Columns.Add( new DataColumn("clsname",System.Type.GetType("System.String")) );
t.Columns.Add( new DataColumn("flag", System.Type.GetType("System.Int32")));
t.Columns.Add( new DataColumn("number", System.Type.GetType("System.Int32")));
for (int i = 0; i < ds.Tables["ClassTable"].Rows.Count; i++)
{
DataRow r = t.NewRow();
for (int j = 0; j < ds.Tables["ClassCount"].Rows.Count; j++)
{
if (ds.Tables["ClassTable"].Rows[i]["flag"].ToString().Equals(ds.Tables["ClassCount"].Rows[j]["flag"].ToString()))
{
r[0] = ds.Tables["ClassTable"].Rows[i]["clsname"];
r[1] = ds.Tables["ClassTable"].Rows[i]["flag"];
r[2] = ds.Tables["ClassCount"].Rows[j]["number"];
break;
}
}
t.Rows.Add(r);
}
这样的实现有点笨拙,不过总算实现了预期的目的,绑定了DataList之后的显示效果:
| 业界新闻(51) |
| 情感日记(147) |
| 办公室援助(73) |
| 网络编程(120) |
| 长短句(116) |
| web标准(3) |
| 计算机安全(3) |
| 硬件|DIY(2) |
其中ClassId的值、分类的名称、统计的数目就是来源与DataTable t。
不知道有没有比这更简单的实现方法呢,渴望赐教。