これはSSRS 2005でも引き続き発生することが確認されています。これは、レポートデザイナーが意図したとおりに表示しないブラウザだけではありません。どうやらIE7(とおそらくIE6)は、要素に複数のスタイル属性が割り当てられている場合、最後のスタイル属性を "勝つ"と仮定しています。 IE8の標準モードとFirefoxは、この状況で「勝利」する最初のスタイル属性を想定しています。私たちのチームはこれをテストしていませんが、すべての標準準拠のブラウザはIE8とFirefoxと同じ選択をすると思います。
解決策の点で解決策が見つかりませんでしたが、悪いHTMLがブラウザに表示されないようにする方法があります。 OMG Ponies - JudyXのポストへのリンクを投稿してくれてありがとう。 Wodehは、そのポストの3/4について、良い解決策を提示しました。残念ながら、投稿されたコードの使い方は完全にはっきりしていませんでした。
ReportViewer Controlを含むページでresponse filterを使用する方法があります。フィルタは、ブラウザに送信される生のHTMLへのアクセス権を持ち、新しい最初の列トリックにならずに直接HTMLを変更する機会を提供します。 Page_Loadメソッドでは、レスポンスを設定します。
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);
}
}
}
ページ生成が間違ったHTML要素にスタイル属性を導入しないようにするには、CSSの最小高さをどのように定義しますか? –