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即可。

祝你好運!