SSRS: 2005, CSS не применяется в первом столбце - PullRequest
2 голосов
/ 15 июля 2009

Некоторые из наших отчетов не отображаются должным образом в Firefox - в первом столбце отсутствует css. После расследования я нахожу:

<tr>
  <td style="HEIGHT:6.93mm" style="...">1st Column</td>
  <td style="...">2nd Column</td>
  <td style="...">3rd Column</td>
</tr>

Когда я удаляю стиль = "ВЫСОТА: 6,93 мм", он корректно отображается в Firefox.

По сообщению JudyX здесь, в понедельник, 13 февраля 2006 г., 23:54 :

Первый столбец в отчетах не может быть правильно оформлен. Элемент управления просмотра отчетов требует, чтобы «высота» была указана для всех строк таблицы. К сожалению, он применяет это не к элементу строки таблицы, а к первой ячейке таблицы в этой строке. Когда он применяет это как атрибут стиля, он конфликтует со стилем, который мы установили в другом месте.

Кто-нибудь нашел решение этой проблемы?

Ответы [ 5 ]

2 голосов
/ 22 июля 2009

Решение на самом деле не решение; это хак.

Когда появится поведение, определите новый первый столбец. Он должен иметь следующие атрибуты:

  1. Пусто - без текста, без выражения и т. Д.
  2. Установить минимальную ширину (0,03125 дюйма)
  3. Если в других ячейках есть стиль рамки, задайте правую границу новой первой ячейки, чтобы она соответствовала при установке белого цвета / etc для остальных.
2 голосов
/ 29 апреля 2010

Я могу подтвердить, что это все еще происходит с SSRS 2005. Firefox - не единственный браузер, который не будет отображать это так, как задумал разработчик отчетов. По-видимому, IE7 (и, вероятно, IE6) предполагают, что последний атрибут стиля «победит», если для элемента назначено несколько атрибутов стиля. IE8 в стандартном режиме и Firefox предполагают первый атрибут стиля, который «победит» в этой ситуации. Я бы предположил, что все совместимые со стандартами браузеры сделают тот же выбор, что и IE8 и Firefox, хотя наша команда не проверяла это.

Я не нашел решения с точки зрения исправления, но у меня есть способ предотвратить попадание плохого HTML в браузер. OMG Ponies - спасибо за размещение этой ссылки на пост JudyX. Вуде ответил хорошим решением на 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 определяется следующим образом и в основном основан на коде Водэ из поста. Секретный соус находится в методе 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);
        }

    }
}
0 голосов
/ 02 сентября 2013

Гораздо более простой обходной путь исправил эту проблему в моем случае. Просто добавили строку с надписью ниже поврежденной и установили Visibility: Hidden = True.

Удачи!

0 голосов
/ 21 мая 2013

Попробуйте AsyncRendering="true" на элементе управления ReportViewer.

При асинхронном рендеринге сгенерированный HTML не имеет двух тегов стиля - он использует тег sytle для высоты, а все остальные стили применяются через атрибут class к элементу td.

0 голосов
/ 16 июля 2009

Это проблема стиля CSS. Я успешно реализовал исправление для этого в прошлом, используя информацию из этого поста :

Обычно вам нужно найти файл css для служб отчетов (по умолчанию он находится в C: \ Program Files \ Microsoft SQL Server \ MSSQL.3 \ Reporting Services \ ReportManager \ Styles \ ReportingServices.css на сервере отчетов), и добавьте к нему это правило класса:

.DocMapAndReportFrame
{
min-height: 860px;
} 
...