在Asp.net中利用JavaScript获得页面上获得水晶报表的内容
主题:在Asp.net中利用JavaScript获得页面上获得水晶报表的内容
关键字:Asp.net 水晶报表 JavaScript
如何在页面上获得水晶报表的内容(即HTML代码)
问题:
页面上有一个CrystalReportViewer1控件,用来显示水晶报表的内容,现在需要在一个TextBox框中获得此控件产生的HTML代码,以便将水晶报表的内容发送到EMAIL中。但是如何获得水晶报表在客户端产生的HTML代码呢?
一开始,我考虑的是采用RenderControl的方法来获得HTML代码,
HtmlTextWriter htw=new HtmlTextWriter(sw);
CrystalReportViewer1.RenderControl(htw);
BodyText.Text = sw.ToString();
但是,这样做就是一直报 CrystalReportViewer1 未将对象设置到对象的实例错误。
上面的代码如果不是 CrystalReportViewer1 ,而是一个普通的 Label,那么就能正确的获得Label产生的HTML代码,看来是 CrystalReportViewer1 初始化时还有别的类没有去做,在仔细的查看了RPT的文件后,发现:水晶报表的RPT控件一般有两个类型:一个是TextObject,显示的是文本;一个是FieldObject,显示的是字段。他们分别实现了自己的接口,并且都是从ReportObject继承下来的,ReportOjbect是直接从Object继承下来的。
问题出现了,RenderControl方法一般是Control类下的,那么就是说,上面的方法是行不通了!
然后我又分析了CrystalReportViewer1 产生的HTML代码,发现其实是在客户端产生了Table,DIV这些东西来显示报表的,并且Table有唯一的ID,DIV也有唯一的ID
这个问题困扰了我很久,终于,我找到了可以实现的方法,那就是使用JavaScript来实现。
解决步骤:
1、在页面上放一个Html控件,并让这个控件作为服务器控件运行,即:
"<INPUT id="Hidden1" type="text" name="Hidden1" runat="server">" (需要去掉最两边的引号)
2、写一个JavaScript:
<script type="text/javascript">
function GetHidden1()
{
document.getElementById("Hidden1").value = CrystalReportViewer1.innerHTML;
}
</script>
上面代码的意思就是:把CrystalReportViewer1的Html取出来,赋给Hidden1
3、然后我在C#的Button中写:
TextBox1.Text = Hidden1.Value;
现在TextBox1中就是CrystalReportViewer1产生的HTML了!
总结:
1、一个方法不行换个角度思考问题,刚开始就认为应该是在服务器端获得,其实不是!
2、JavaScript的重要性!用JavaScript来获得客户端的HTML
3、JavaScript的变量传进C#中,使用隐藏域的方式,其实.Net的视图ViewState也是这个道理。
4、这个方法不光适用于水晶报表,还可以用这个方法来获得其他控件产生的代码
5、回去有时间要学习JavaScript和DHTML(DOM)

浙公网安备 33010602011771号