2

一部のレポートが 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 で適切にレンダリングされます。

2006 年 2 月 13 日月曜日の午後 11 時 54 分の JudyX の投稿によると、次のようになります。

レポートの最初の列のスタイルを正しく設定できません。レポート ビューアー コントロールでは、すべてのテーブル行に「高さ」を指定する必要があります。残念ながら、これは table-row 要素ではなく、その行内の最初の table-cell に適用されます。それをスタイル属性として適用すると、他の場所で設定したスタイルと競合します。

誰かがこれに対する解決策を見つけましたか?

4

5 に答える 5

2

これは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);
        }

    }
}
于 2010-04-29T02:16:20.817 に答える
0

コントロール を試してみてくださいAsyncRendering="true"ReportViewer

非同期レンダリングでは、生成された HTML に 2 つのスタイル タグがありません。高さのスタイル タグを使用し、他のすべてのスタイルは要素のclass属性を介して適用されtdます。

于 2013-05-20T20:19:13.530 に答える
0

私の場合、はるかに簡単な回避策でこの問題が修正されました。破損した行の下に別の行を追加し、Visibility:Hidden = True に設定します。

幸運を!

于 2013-09-02T10:13:52.517 に答える