.NET中RDLC循环处理数据的应用分析
程序员文章站
2024-03-02 23:34:40
当我们在使用rdlc开发报表的时候,如果数据源内容如下。复制代码 代码如下:private list createdataset(){&nb...
当我们在使用rdlc开发报表的时候,如果数据源内容如下。
private list<userdata> createdataset()
{
list<userdata> userdataset = new list<userdata>();
userdataset.add(new userdata() { name = "clark", age = 18 });
userdataset.add(new userdata() { name = "yaya", age = 15 });
return userdataset;
}
=sum(code.pushstring(fields!name.value, fields!age.value), "userdataset")
接着看code.pushstring这个rdlc自定义函式的内部,使用了一个static的字符串变量,来记录每一笔数据处理之后的结果。到这边开发人员应该可以理解,这样的方式就是在跑循环处理数据。
public shared _foreachresult as string = string.empty
public shared function pushstring(username as string, userage as string) as integer
_foreachresult += username & "(" & userage & "), "
return 0
end function
当然啦,跑完循环处理完数据,最终还是要将数据显示在画面上。这边很简单的就是建立一个code.popstring回传。
public shared function popstring() as string
return _foreachresult
end function
并且将原本的表达式改写成为:
=iif(sum(code.pushstring(fields!name.value, fields!age.value), "userdataset") <> 0, "", code.popstring())
编译并且执行之后,就可以看到在rdlc的文本框里,已经正确的显示了客户要求的数据格式。
复制代码 代码如下:
private list<userdata> createdataset()
{
list<userdata> userdataset = new list<userdata>();
userdataset.add(new userdata() { name = "clark", age = 18 });
userdataset.add(new userdata() { name = "yaya", age = 15 });
return userdataset;
}
我们可以很快速的使用rdlc里的数据表控件,来将数据呈现在报表上。
但是当客户要求下图的报表,要将数据源内容显示在一行。rdlc处理这种需求就没有那么简单,这是因为rdlc没有循环处理的函式可以使用。造成开发人员要组合数据,必须使用隐藏列表、在外部组合字符串…等等迂回的方式建立报表内容。但这样的方式开发,既没有效率而且也有很多的限制。
这个问题困扰了我好几天,昨晚睡到一半忽然有灵感。可以使用rdlc里的sum函式,来做数据循环的处理。
sum函式会取得数据集中的每一笔资料,并且计算出全部数据的总和。我们可以将表达式写为下列的函式,利用code.pushstringstack这个rdlc自定义函式,来让sum函式取得所有数据。这样的写法,就可以将数据集中的每一笔数据都交由code.pushstring处理过一次。
复制代码 代码如下:
=sum(code.pushstring(fields!name.value, fields!age.value), "userdataset")
接着看code.pushstring这个rdlc自定义函式的内部,使用了一个static的字符串变量,来记录每一笔数据处理之后的结果。到这边开发人员应该可以理解,这样的方式就是在跑循环处理数据。
复制代码 代码如下:
public shared _foreachresult as string = string.empty
public shared function pushstring(username as string, userage as string) as integer
_foreachresult += username & "(" & userage & "), "
return 0
end function
当然啦,跑完循环处理完数据,最终还是要将数据显示在画面上。这边很简单的就是建立一个code.popstring回传。
复制代码 代码如下:
public shared function popstring() as string
return _foreachresult
end function
并且将原本的表达式改写成为:
复制代码 代码如下:
=iif(sum(code.pushstring(fields!name.value, fields!age.value), "userdataset") <> 0, "", code.popstring())
编译并且执行之后,就可以看到在rdlc的文本框里,已经正确的显示了客户要求的数据格式。
范例程序 : rdlcforeachdatasample_jb51net点此下载。