在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)

posted @ 2005-05-20 16:27  老姜  阅读(1013)  评论(0)    收藏  举报