【问题标题】:SSRS: 2005, CSS not applied on first columnSSRS:2005,第一列未应用 CSS
【发布时间】:2009-07-15 18:14:25
【问题描述】:

我们的一些报告无法在 Firefox 中正确显示 - 第一列缺少任何 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

报告中的第一列无法正确设置样式。报表查看器控件需要为所有表格行指定“高度”。不幸的是,它不是将此应用于 table-row 元素,而是应用于该行中的第一个 table-cell。当它作为样式属性应用时,它与我们在其他地方设置的样式冲突。

有人找到解决办法了吗?

【问题讨论】:

    标签: sql-server sql-server-2005 reporting-services reportingservices-2005


    【解决方案1】:

    我可以确认,SSRS 2005 仍然会发生这种情况。Firefox 并不是唯一一个不会按照报表设计器的预期呈现的浏览器。显然,如果在一个元素上分配了多个样式属性,则 IE7(可能还有 IE6)假定最后一个样式属性为“赢”。在这种情况下,标准模式下的 IE8 和 Firefox 假定第一个样式属性为“赢”。我会假设所有符合标准的浏览器都会做出与 IE8 和 Firefox 相同的选择,尽管我们的团队尚未对此进行测试。

    我还没有找到关于修补程序的解决方案,但我确实有办法防止坏的 HTML 进入浏览器。 OMG Ponies - 感谢您将链接发布到 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() 方法中,它使用 RegEx 清除第一个样式属性:

    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);
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      1. 空 - 没有文字、没有表达等
      2. 设置最小宽度(0.03125 英寸)
      3. 如果其他单元格有边框样式,则设置新的第一个单元格的右边框以匹配,同时为其他单元格设置白色/等。

      【讨论】:

        【解决方案3】:

        这是一个 CSS 样式问题。我过去使用来自this post 的信息成功地解决了这个问题:

        您基本上必须找到报告服务的 css 文件(默认情况下,位于报告服务器上的 C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportManager\Styles\ReportingServices.css),并将这个类规则添加到它:

        .DocMapAndReportFrame
        {
        min-height: 860px;
        } 
        

        【讨论】:

        • 如何在 CSS 中定义 min-height 以阻止页面生成在错误的 HTML 元素中引入样式属性?
        【解决方案4】:

        ReportViewer 控件上尝试AsyncRendering="true"

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

        【讨论】:

          【解决方案5】:

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

          祝你好运!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多