これはSSRS2005でも引き続き発生することを確認できます。レポートデザイナーが意図したとおりにこれをレンダリングしないブラウザーはFirefoxだけではありません。要素に複数のスタイル属性が割り当てられている場合、IE7(およびおそらくIE6)は最後のスタイル属性が「勝つ」と想定しているようです。標準モードのIE8とFirefoxは、この状況で「勝つ」ための最初のスタイル属性を想定しています。私たちのチームはこれをテストしていませんが、すべての標準準拠のブラウザーはIE8およびFirefoxと同じ選択をするだろうと思います。
ホットフィックスに関する解決策は見つかりませんでしたが、不正なHTMLがブラウザに到達するのを防ぐ方法はあります。OMGポニー-JudyXの投稿へのリンクを投稿していただきありがとうございます。Wodehは、その投稿の約3/4のところにある良い解決策で応答しました。残念ながら、投稿されたコードの使用方法は完全には明確ではありませんでした。
アプローチは、 ReportViewerコントロールを含むページで応答フィルターを使用することです。フィルタは、ブラウザに送信される生の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のコードに基づいています。秘密のソースは、RegExを使用して最初のスタイル属性を消去する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);
}
}
}