SSRS:2005,CSS未应用于第一列

时间:2009-07-15 18:14:25

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

我们的一些报告在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中正确呈现。

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

  

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

有没有人找到解决方案?

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

我还没有找到一个修补程序的解决方案,但我确实有办法防止坏的HTML进入浏览器。 OMG小马 - 感谢您发布链接到JudyX的帖子。 Wodeh在该帖子的3/4左右回答了一个很好的解决方案 - 不幸的是,如何使用发布的代码并不完全清楚。

方法是在包含response filter的页面上使用ReportViewer Control。过滤器可以访问将发送到浏览器的原始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 :(得分:0)

这是一个CSS样式问题。我过去使用this post

中的信息成功实施了此修复程序

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

.DocMapAndReportFrame
{
min-height: 860px;
} 

答案 3 :(得分:0)

AsyncRendering="true"控件上尝试ReportViewer

使用异步呈现,生成的HTML没有两个样式标记 - 它使用高度的sytle标记,并通过class元素上的td属性应用所有其他样式。

答案 4 :(得分:0)

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

祝你好运!