2

我们的一些报告在Firefox中无法正确显示 - 第一列缺少任何CSS。经过调查,我发现:SSRS:2005,CSS未应用于第一列

<tr> 
    <td style="HEIGHT:6.93mm" style="...">1st Column</td> 
    <td style="...">2nd Column</td> 
    <td style="...">3rd Column</td> 
</tr> 

当我删除style =“HEIGHT:6.93mm”,它在Firefox中正确渲染。

每JudyX的帖子here on Monday, February 13, 2006 11:54 PM

在报告的第一列无法正确样式。报表查看器控件需要为所有表格行指定“高度”。不幸的是,它不适用于表格行元素,而是适用于该行内的第一个表格单元格。当它将它作为样式属性应用时,它会与我们在别处设置的样式相冲突。

有没有人找到解决方案?

回答

2

我可以确认这仍然发生在SSRS 2005上.Firefox不是唯一的浏览器,它不会按照报表设计者的意图进行渲染。显然,如果在元素上分配了多个样式属性,IE7(也可能是IE6)会假定最后一个样式属性为“赢”。标准模式下的IE8和Firefox在这种情况下承担第一种风格的属性来“赢”。我认为所有符合标准的浏览器都会和IE8和Firefox做出同样的选择,虽然我们的团队还没有测试过。

我还没有找到一个解决方案的修补程序,但我确实有办法阻止错误的HTML到浏览器。 OMG小马 - 感谢发布该链接到JudyX的帖子。 Wodeh回复说,在这篇文章的3/4中有一个很好的解决方案 - 不幸的是,如何使用已发布的代码并不完全清楚。

该方法是在包含ReportViewer Control的页面上使用response filter。过滤器可以访问将被发送到浏览器的原始HTML,并且可以直接修改HTML,而不必产生新的第一列技巧。在我们的Page_Load方法中,我们设置了Response。Filter属性用下面的代码:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Filter = new CorrectSSRSIssuesResponseFilter(Response.Filter); 
     if (!IsPostBack) { 
      RenderReport(); 
     } 
    } 

的CorrectSSRSIssuesResponseFilter类定义如下,且大多是基于关闭从后Wodeh的代码。秘决是在使用正则表达式全歼第一个样式属性的Write()方法:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 

namespace Reports 
{ 
    public class CorrectSSRSIssuesResponseFilter : Stream 
    { 
     private Stream _sink; 
     private StringBuilder Output = new StringBuilder(); 

     public CorrectSSRSIssuesResponseFilter(Stream sink) 
      : base() 
     { 
      _sink = sink; 
     } 

     public CorrectSSRSIssuesResponseFilter() 
      : base() 
     { 
      _sink = new MemoryStream(); 
     } 

     public override bool CanRead { get { return true; } } 
     public override bool CanSeek { get { return true; } } 
     public override bool CanWrite { get { return true; } } 
     public override void Flush() 
     { 
      _sink.Flush(); 
     } 
     public override long Length 
     { 
      get { return _sink.Length; } 
     } 
     public override long Position 
     { 
      get 
      { return _sink.Position; } 
      set 
      { _sink.Position = value; } 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _sink.Read(buffer, offset, count); 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      return _sink.Seek(offset, origin); 
     } 

     public override void SetLength(long value) 
     { 
      _sink.SetLength(value); 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      string strBuffer = UTF8Encoding.UTF8.GetString(buffer, offset, count); 
      //A Closing HTML tag indicates the response object has finished recieving the entire content of the page 
      strBuffer = System.Text.RegularExpressions.Regex.Replace(
       strBuffer 
       , "<TD style=\"[^\"]*\" style=(?<goodStyle>\"[^\"]*\")>" 
       , "<TD style=${goodStyle}>" 
       , System.Text.RegularExpressions.RegexOptions.Compiled 
       ); 

      buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); 
      _sink.Write(buffer, offset, buffer.Length); 
     } 

    } 
} 
0

这是一个CSS样式问题。我已经使用this post的信息成功实施了此过程中的修复程序:

您基本上必须找到用于报告服务的css文件(默认位于C:\ Program Files \ Microsoft SQL Server \ MSSQL。 3 \ Reporting Services的\ ReportManager \样式\ ReportingServices.css在报表服务器上),而这个阶级统治添加到它:

.DocMapAndReportFrame 
{ 
min-height: 860px; 
} 
+0

如何在CSS中定义最小高度以阻止页面生成在错误的HTML元素中引入样式属性? – 2009-07-16 17:19:58

2

的解决方案是不是一个真正的解决方案;这是一个黑客。

当行为出现时,定义一个新的第一列。它应该具有以下属性:

  1. 空 - 没有文字,没有表情,等
  2. 设置最小宽度(0.03125英寸)
  3. 如果在其他细胞边框的造型,风格右边界新的第一个单元匹配,而其他设置为白色等。
0

ReportViewer控制尝试AsyncRendering="true"

使用异步渲染,生成的HTML没有两个样式标签 - 它使用sytle标签作为高度,所有其他样式通过td元素上的class属性应用。

0

一个更简单的解决方法解决了这个问题在我的情况。只需在损坏的下方添加一行代码并设置Visibility:Hidden = True即可。

祝你好运!