2

Certains de nos rapports ne s'affichent pas correctement dans Firefox - la première colonne ne contient aucun CSS. Après enquête, je trouve:SSRS: 2005, CSS non appliqué sur la première colonne

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

Lorsque je supprime le style = "Hauteur: 6.93mm", il affiche correctement dans Firefox.

poste de Per JudyX here on Monday, February 13, 2006 11:54 PM:

La première colonne dans les rapports ne peuvent être coiffés correctement. Le contrôle du visualiseur de rapports nécessite la définition d'une "hauteur" pour toutes les lignes de la table. Malheureusement, cela ne s'applique pas à l'élément table-row, mais à la première table-cellule de cette rangée. Quand il s'applique comme attribut de style, il est en conflit avec le style que nous avons défini ailleurs.

Est-ce que quelqu'un a trouvé une solution à cela?

Répondre

2

Je peux confirmer que cela se produit encore avec SSRS 2005. Firefox n'est pas le seul navigateur qui ne rendra pas cela comme prévu par le concepteur de rapports. Apparemment, IE7 (et probablement IE6) suppose que le dernier attribut de style est "win" s'il y a plusieurs attributs de style assignés à un élément. IE8 en mode standard et Firefox assument le premier attribut de style à "gagner" dans cette situation. Je suppose que tous les navigateurs compatibles avec les normes feront le même choix que IE8 et Firefox, bien que notre équipe n'ait pas testé cela.

Je n'ai pas trouvé de solution en termes de correctif, mais j'ai un moyen d'empêcher le mauvais HTML de se rendre dans le navigateur. OMG Ponies - merci d'avoir posté ce lien vers le post de JudyX. Wodeh a répondu avec une bonne solution sur les 3/4 de ce post - malheureusement, il n'était pas tout à fait clair comment utiliser le code qui a été posté. L'approche est d'utiliser un response filter sur la page qui contient le ReportViewer Control. Le filtre a accès au code HTML brut qui sera envoyé au navigateur, ce qui permet de modifier le code HTML directement sans avoir à générer le nouveau tour de la première colonne. Dans notre méthode Page_Load, nous définissons la réponse.Filtre propriété avec le code suivant:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Filter = new CorrectSSRSIssuesResponseFilter(Response.Filter); 
     if (!IsPostBack) { 
      RenderReport(); 
     } 
    } 

La classe CorrectSSRSIssuesResponseFilter est définie comme suit et est principalement basée hors du code de Wodeh du poste. La sauce secrète est dans la méthode Write() qui utilise le RegEx pour effacer le premier attribut de style:

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

Ceci est un problème de style CSS. J'ai résolu avec succès un correctif pour cela dans le passé en utilisant l'information de this post:

Vous devez trouver le fichier css pour les services de reporting (par défaut, situé dans C: \ Program Files \ Microsoft SQL Server \ MSSQL). 3 \ Reporting services \ ReportManager \ Styles \ ReportingServices.css sur le serveur de rapports), et ajouter cette règle de classe à elle:

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

Comment la définition de min-height dans CSS va-t-elle empêcher la génération de page d'introduire un attribut de style dans le mauvais élément HTML? –

2

la solution est pas vraiment une solution; c'est un hack. Lorsque le comportement apparaît, définissez une nouvelle première colonne. Il doit avoir les attributs suivants:

  1. vide - aucun texte, aucune expression, etc
  2. Définissez la largeur minimum (0,03125 pouces)
  3. S'il y a un style de bordure sur les autres cellules, le style de la bordure droite de la nouvelle première cellule pour correspondre tout en définissant blanc/etc pour les autres.
0

Essayez AsyncRendering="true" sur le contrôle ReportViewer. Avec le rendu asynchrone, le code HTML généré n'a pas deux balises de style: il utilise une balise sytle pour la hauteur et tous les autres styles sont appliqués via un attribut class sur l'élément td.

0

Une solution de contournement beaucoup plus simple a résolu ce problème dans mon cas. Il suffit d'ajouter une ligne en dessous de la ligne endommagée et de définir Visibilité: Hidden = True.

Bonne chance!

Questions connexes