我们的一些报告在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:
报告中的第一列无法正确设置样式。报表查看器控件需要为所有表行指定“高度”。不幸的是,它不是应用于表行元素,而是应用于该行中的第一个表格单元格。当它将其应用为样式属性时,它会与我们在其他位置设置的样式冲突。
有没有人找到解决方案?
答案 0 :(得分:2)
解决方案不是真正的解决方案;这是一个黑客。
出现该行为时,请定义新的第一列。它应该具有以下属性:
答案 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。
祝你好运!