Edition - 2016/2017 Mise à jour
SSRS 2016+ peut dire être cross-browser compatible.
Les bordures de tableau ne s'affichent pas correctement dans IE10, mais IE10 est en train de disparaître de toute façon.
Dans le reste des navigateurs, ça va.
Vous devez toujours enregistrer add_pageLoaded
pour traduire les invites de paramètre.
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function() { fixReportingServices('rpt-container'); });
En outre, comme dans les versions < 2016, vous devez ajouter PageCountMode="Actual"
-RS:ReportViewerHost
contrôle.
<RS:ReportViewerHost ID="ReportViewerControl" PageCountMode="Actual" runat="server" />
si vous voulez avoir des numéros de pagination significatifs.
De plus, il y a un problème lorsque vous définissez la langue dans la chaîne de requête avec des datpickers (avec SSRS < 2016 également). Vous devez définir context.Request.UserLanguages[i]
dans la langue spécifiée dans la chaîne de requête dans context.BeginRequest dans un module HTTP si vous souhaitez que datepicker fonctionne avec un langage autre que celui du navigateur. De plus, vous devez ajouter les en-têtes HTTP X-Frame-Options et Content-Security-Policy dans chaque réponse HTTP, si vous voulez utiliser SSRS dans un iframe sur Internet en toute sécurité. Voir my github-repository for details.
</EndEdit>
pré-2016:
Je peux vous dire, j'ai 9 ans d'expérience avec la fichue chose (SSRS 2005, SSRS 2008 R1 & R2, 2012 et 2014 SSRS). Permettez-moi de vous assurer que parce que les rapports HTML SSRS dépendent de IE5-Quirksmode, il n'y a aucune chance qu'ils soient rendus correctement dans n'importe quel navigateur autre qu'Internet Explorer (IE < 10 que je pourrais être enclin à ajouter). Si vous avez un accès admin au serveur de rapports, et je souligne le IF, vous pouvez ajouter des routines jQuery et CSS sur la page ReportViewer pour corriger les problèmes les plus basiques (comme si vous ne voyez pas plus de 1cm du rapport), mais sinon, le rendu HTML sera toujours absolument horrible (marges, bordures de tableau, paddings d'image, taille de colonne, taille de champ de texte, alignement de titre et/ou de numéro de pagination, etc.),
Bien sûr, le contrôle d'imprimante ActiveX ne peut fonctionner que dans InternetExplorer (sous Windows), car seuls les ActiveX sont pris en charge. Permettez-moi aussi de vous assurer qu'il n'y a absolument aucun moyen de faire fonctionner ReportManager dans un autre navigateur que IE. En ce qui concerne la prise en charge d'Internet Explorer, il convient de mentionner qu'à partir de IE version 10, IE est par défaut webkit-quirksmode (pour des raisons de compatibilité) au lieu de IE5 quirksmode, donc le rendu HTML sera aussi horrible que dans Chrome./Firefox/Safari pour IE 10+, sauf si vous avez ajouté IE5 compatible avec meta xua dans la page ReportViewer.aspx.
Ce dernier pourrait ne pas demander Intranet, comme IE revient automatiquement à IE 7 en mode de compatibilité quand il est sur un site intranet (mais seulement dans une version de Windows 8 <).Dans Windows 8, les liens localhost et les liens d'ordinateur (impossible d'ajouter les messages http: // dans les messages stackoverflow) ne sont pas affectés à la zone intranet locale (probablement comme un hack rapide, donc IE ne dépend pas de la compatibilité IE7 mode), et par conséquent, l'authentification Windows échouera.
Il convient également de mentionner qu'il n'est pas possible d'ajouter IE5 compatible avec meta xua pour ReportManager, car il n'y a pas de page que vous pouvez éditer (projet-site ASP.NET non-modifiable compilé ...).
Et si vous n'avez pas besoin des dev-tools pour passer en mode quirksmode, il n'est pas possible d'utiliser ReportManager dans IE 10+. Ensuite, une autre chose à mentionner est que, à partir de IE9, IE hérite du doctype des éléments iframe de la page parent, et il n'y a aucun moyen de changer cela (sans changer la page parente à la page-enfant doc-mode). Donc, si vous aviez assez d'intelligence pour utiliser les iframes pour les rapports, parce qu'il n'y a pas moyen qu'une personne sensée veuille des popups à l'ère des popup-blockers, la page de rapport héritera du doctype de la page parente. Si ce n'est pas IE5-QuirksMode, cela rendra les rapports tout aussi horribles que sur Safari/Chrome/Firefox/Opera pour n'importe quel IE> 8, indépendamment de toute balise ie5 méta-compatible dans ReportViewer.aspx. En ce qui concerne les alternatives, gratuitement et avec un ensemble de fonctionnalités similaire, il n'y a que Eclipse BIRT (heureusement, le rendu HTML n'est pas similaire). Il convient de mentionner que BIRT, bien que sous licence Eclipse Public License, utilise SUN Java et que vous utilisez par conséquent la technologie Oracle, qui est soumise à ses conditions de licence respectives.
En outre, vous utilisez une technologie non-Microsoft, et les rendus BIRT Excel-Sheets sont en fait des fichiers XML, qui produiront (qui aurait deviné) un avertissement plutôt alarmant lors de l'ouverture dans Office 2010+. Puis, pour un montant relativement élevé, il y a http://www.stimulsoft.com rapports, et des rapports Telerik. Du point de vue technique, je recommande des rapports stimululsoft, mais: disclaimer, je n'ai pas utilisé l'un ou l'autre, car ils ne sont pas gratuits. En ce qui concerne les moteurs de rendu SSRS alternatifs (pas les téléspectateurs btw), il n'y a que www.fyireporting.com/, qui a une fourchette ici http://www.codeproject.com/Articles/138271/An-Open-Source-RDL-Engine. Mais fyiReporting est incomplet et fonctionne en cours (s'il n'est pas abandonné), donc je m'abstiendrai de l'utiliser.
En bout de ligne, si votre produit est IE & Windows uniquement, avec la version Windows 8 < (et non - pas < = juste au cas où vous ne l'avez pas fait attention), dans l'intranet, appelé de pop- ups et pas iframes, puis aller avec SSRS. Pour tout le reste, utilisez les rapports stimulsoft (le problème est, vous devez refaire tous vos rapports, car il n'y a pas de migration automatisée - même pas de travail).
PS:
Et en ajoutant « un peu javascript », je veux dire la chose ci-dessous (2008 R1 édition, ne fonctionnera pas sur 2008R2 +, peut travailler sur 2005, et notez que vous devez intégrer jQuery et jQuery Migrate dans une balise de script en ligne, si les PC clients n'ont pas accès à http (s): //ajax.aspnetcdn.com [note: placer les scripts dans le dossier Pages et ajouter un lien relatif ou absolu ' t travail ...]):
<%@ Register TagPrefix="RS" Namespace="Microsoft.ReportingServices.WebServer" Assembly="ReportingServicesWebServer" %>
<%@ Page Language="C#" AutoEventWireup="true" Inherits="Microsoft.ReportingServices.WebServer.ReportViewerPage" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<%= System.Web.HttpContext.Current.Request.Browser.Browser == "IE" && System.Globalization.CultureInfo.InvariantCulture.CompareInfo.IndexOf(System.Convert.ToString(System.Web.HttpContext.Current.Request.QueryString), "stylesheet", System.Globalization.CompareOptions.IgnoreCase) == -1 ? (System.Web.HttpContext.Current.Request.Browser.Browser != "IE" ? "": "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=5\">") : "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">" %>
<head id="headID" runat="server">
<title>Report Viewer</title>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.migrate/jquery-migrate-1.1.0.min.js"></script>
<script type="text/javascript">
var bInFrameOrIframe = false;
var iLanguageIndex = 0;
var language = "DE_LOL";
var UpdateLock = false;
if (window.self === window.top) {
// alert("true");
// not in a frame
// Use IE5 quirksmode
//document.writeln('<meta http-equiv="X-UA-Compatible" content="IE=5" />');
bInFrameOrIframe = false
}
else {
// in a frame, FMS
bInFrameOrIframe = true;
}
function TranslateParameterPrompts() {
//mTo = false;
$("table[id^='ParametersGridReportViewerControl'] span").each(function(index) {
var strText = $(this).text();
if (strText != null && strText.indexOf('/') != -1) {
strText = strText.split('/');
if (iLanguageIndex < strText.length)
strText = strText[iLanguageIndex];
else {
if (strText.length > 0)
strText = strText[0];
}
$(this).text(strText);
}
});
//setTimeout(function(){mTo = true}, 5000);
}
function setTableSize() {
//$("[id$='ReportViewerControl']")
$(
$(
$("#ReportFrameReportViewerControl")[0].contentWindow.document
)
.find("[id$='report']")[0].contentWindow.document.body
).find('*')
.each(function() {
//console.log("Processing an element");
//var cls = $(this).attr("class");
try {
// Don't add a border to sort-arrow
if ($(this).is('img')) {
return;
}
var anywidth = $(this).css('width');
var anywidth = parseFloat(anywidth);
//console.log("anywidth: " + anywidth);
//var lol = $(this).css('borderLeftWidth');
var blw = $(this).css('border-left-width');
var brw = $(this).css('border-right-width');
var btw = $(this).css('border-top-width');
var bbw = $(this).css('border-bottom-width');
var borls = $(this).css('border-left-style') == "solid";
var borrs = $(this).css('border-right-style') == "solid";
var borts = $(this).css('border-top-style') == "solid";
var borbs = $(this).css('border-bottom-style') == "solid";
var blw = parseFloat(blw);
var brw = parseFloat(brw);
var btw = parseFloat(btw);
var bbw = parseFloat(bbw);
//parseInt($(this).css("borderRightWidth"))
//console.log(parseInt($(this).css("borderLeftWidth")));
UpdateLock = true;
// Set width to 1px where 0px
if (anywidth == 0)
$(this).css('width', '1px');
if (borls && blw == 0.0 || (blw > 0.0 && blw < 1.0)) {
//console.log("setting border width");
$(this).css('border-left-width', '1px');
}
if (borrs && brw == 0.0 || (brw > 0.0 && brw < 1.0)) {
$(this).css('border-right-width', '1px');
}
if (borts && btw == 0.0 || (btw > 0.0 && btw < 1.0)) {
$(this).css('border-top-width', '1px');
}
if (borbs && bbw == 0.0 || (bbw > 0.0 && bbw < 1.0)) {
$(this).css('border-bottom-width', '1px');
}
UpdateLock = false;
}
catch (ex) {
UpdateLock = false;
//console.log(ex);
}
}); // End $('*').each
// console.log("loop");
var $img = $("img[onload^='this.fitproportional=true']");
if ($img == null) {
// console.log("img is null");
return;
}
var $div = $img.parent();
if ($div == null) {
// console.log("div is null");
return;
}
UpdateLock = true;
{
$img.removeAttr("height");
$img.css('max-width', '100%')
$img.css('max-height', '100%')
$div.css('text-align', 'right');
var divMinWidth = parseFloat($div.css('min-width'));
var divWidth = parseFloat($div.css('width'));
var divMinHeight = parseFloat($div.css('min-height'));
var divHeight = parseFloat($div.css('height'));
// console.log("width: " + divWidth);
// console.log("height: " + divHeight);
// console.log("min-width: " + divMinWidth);
// console.log("min-height: " + divMinHeight);
if (divMinWidth != 0)
$div.css('width', $div.css('min-width'));
if (divMinHeight != 0)
$div.css('height', $div.css('min-height'));
}
UpdateLock = false;
}
$(document).ready(function() {
switch (language) {
case "fr":
iLanguageIndex = 1;
break;
case "it":
iLanguageIndex = 2;
break;
case "en":
iLanguageIndex = 3;
break;
default: // "DE"
iLanguageIndex = 0;
}
TranslateParameterPrompts();
// setInterval(function() { TranslateParameterPrompts() }, 100);
if ($.browser.msie && !bInFrameOrIframe)
return;
// if ($.browser.webkit)
//setTableSize();
$("[id$='ReportFrameReportViewerControl']").load(function() {
//setNewHeight();
//alert("Loading");
setTableSize();
$(
$("[id$='ReportFrameReportViewerControl']")[0].contentWindow.document
)
.find("[id$='report']").load(function() {
//alert("load report");
setTableSize();
}
); // End load #report
}); // End Function load #ReportFrameReportViewerControl
}); // End Function document.ready
</script>
</head>
<body style="margin: 0px; overflow: auto">
<form style="width:100%;height:100%" runat="server" ID="ReportViewerForm">
<RS:ReportViewerHost ID="ReportViewerControl" runat="server" />
</form>
</body>
</html>
Note: UpdateLock provient de 2012 backport et n'est pas vraiment utilisé ici, et la langue provient de backport aussi setInterval sur TranslateParameterPrompts est nécessaire en 2012 et la fonction pour 2012 n'a que le petit ajout de "label" dans le sélecteur jQuery ...
function TranslateParameterPrompts() {
//mTo = false;
$("table[id^='ParametersGridReportViewerControl'] label span").each(function(index) {
var strText = $(this).text();
if (strText != null && strText.indexOf('/') != -1) {
strText = strText.split('/');
if (iLanguageIndex < strText.length)
strText = strText[iLanguageIndex];
else
{
if(strText.length > 0)
strText = strText[0];
}
$(this).text(strText);
}
});
//setTimeout(function(){mTo = true}, 5000);
}
la langue de inférer la langue du navigateur va comme ceci, BTW:
<script type="text/javascript">
language = <%= System.Web.HttpContext.Current.Request.UserLanguages != null ? "\"" + System.Convert.ToString(System.Web.HttpContext.Current.Request.UserLanguages[0]) + "\"" : "null" %>;
if(language == null)
language = window.navigator.userLanguage || window.navigator.language;
if(language != null)
language = language.substr(0,2).toLowerCase();
</script>
Et en 2012, vous devez disposer des cookies de session, sinon vous obtenez « HTTP 400: en-tête trop long » après l'ouverture d'environ 120 rapports:
<script type="text/C#" runat="server">
protected string ClearSessionKeepAliveCookiesToPreventHttp400HeaderTooLong()
{
if(Request == null || Request.Cookies == null)
return "";
if(Request.Cookies.Count < 60)
return "";
// System.Web.HttpContext.Current.Response.Write("<h1>"+Request.Cookies.Count.ToString()+"</h1>");
for(int i = 0; i < System.Web.HttpContext.Current.Request.Cookies.Count; ++i)
{
if(StringComparer.OrdinalIgnoreCase.Equals(Request.Cookies[i].Name, System.Web.Security.FormsAuthentication.FormsCookieName))
continue;
if(!Request.Cookies[i].Name.EndsWith("_SKA", System.StringComparison.OrdinalIgnoreCase))
continue;
if(i > 60)
break;
//System.Web.HttpContext.Current.Response.Write("<h1>"+Request.Cookies[i].Name+"</h1>");
System.Web.HttpCookie c = new System.Web.HttpCookie(Request.Cookies[i].Name);
//c.Expires = System.DateTime.Now.AddDays(-1);
c.Expires = new System.DateTime(1970, 1 ,1);
c.Path = Request.ApplicationPath + "/Pages";
c.Secure = false;
c.HttpOnly = true;
// http://stackoverflow.com/questions/5517273/httpcookiecollection-add-vs-httpcookiecollection-set-does-the-request-cookies
//Response.Cookies[Request.Cookies[i].Name] = c;
//Response.Cookies.Add(c);
Response.Cookies.Set(c);
}
return "";
}
</script>
Et sur 2012, vous devez écouter mise à jour du contenu, car il utilise des contrôles Microsoft Ajax
function cbOnContentUpdate() {
//console.log("content update");
alterTableBorderWidth();
// TranslateParameterPrompts();
} // End Callback cbOnContentUpdate
var hLastTimeout = null;
function queueUpdate() {
if (UpdateLock)
return;
if (hLastTimeout != null)
clearTimeout(hLastTimeout);
hLastTimeout = window.setTimeout(function() { cbOnContentUpdate(); }, 50);
//window.setTimeout(function() { cbOnContentUpdate(); }, 3000);
} // End Function queueUpdate
$(document).ready(function() {
switch (language) {
case "fr":
iLanguageIndex = 1;
break;
case "it":
iLanguageIndex = 2;
break;
case "en":
iLanguageIndex = 3;
break;
default: // "DE"
iLanguageIndex = 0;
}
setInterval(function() { TranslateParameterPrompts() }, 100);
// opt-out for non-framed IE, because that crook supports IE5-Quirks (framed takes parent-doctype in IE >= 9)
if ($.browser.msie && !areWeInFrame())
return;
// if ($.browser.webkit)
// console.log('Setting event listener!');
// http://stackoverflow.com/questions/4979738/fire-jquery-event-on-div-change
//$("[id$='ReportViewerControl']").bind('DOMNodeInserted DOMNodeRemoved', function(event) {
//$("[id$='ReportArea']")
$("body")
.bind('DOMNodeInserted DOMNodeRemoved DOMSubtreeModified', function(event) {
if (event.type == 'DOMNodeInserted') {
//console.log('Content added! Current content:' + '\n\n' + this.innerHTML);
//console.log('Content added!');
queueUpdate();
}
else {
//console.log('Content removed! Current content:' + '\n\n' + this.innerHTML);
//console.log('Content removed!');
queueUpdate();
}
}); // End Bind IRM
}); // End Function $(document).ready
et notez que pour 2012, setTableSize est alterTableBorderWidth, et le sélecteur se présente comme suit:
function alterTableBorderWidth()
{
//$('*')
$("[id$='ReportViewerControl']").find('*')
.each(function() {
Btw, si vous voulez supprimer l'icône PRINT, car ce n'est qu'une source de chagrin, ça va comme ça (pour l'allemand, l'anglais, le français et l'italien [les langues parlées en Suisse + anglais]).
Ce CSS est pour 2008 R1, ne savent pas et de soins si elle est la même chose en 2012.
input[type="image"][title="Drucken"], input[type="image"][title="Print"], input[type="image"][title="Imprimer"], input[type="image"][title="Stampa"]
{
display: none !important;
}
Et si cela ne fonctionne toujours pas vous décourager, puis allez à droite formes avant et utiliser l'authentification en SSRS 2012 (indice 1: il n'y a pas d'échantillon ms-provied comme pour 2005-2008R2, vous devez l'écrire vous-même);)
Hint2: si vous avez suivi hint1, la redirection d'authentification par formulaires ne fonctionne pas lorsque vous avez un deux points dans l'URL [bug?], vous pouvez voler le code de mono et écrire votre propre redirection. Hint3: si vous avez suivi hint2 et que l'authentification par formulaires fonctionne, alors vous voudrez probablement changer l'outil de téléchargement que vous allez écrire, car vous n'aimerez pas le faire manuellement "pour chaque rapport browse-directory - check case Autoriser override - rapport de téléchargement - set source de données) pour 120 rapports ou plus, alors vous serez Héritière d'une classe de ReportingService2005 et passer outre GetWebRequest et GetWebResponse
''' <summary>
''' Overriding the method defined in the base class.
''' </summary>
''' <param name="uri"></param>
''' <returns></returns>
Protected Overrides Function GetWebRequest(uri As Uri) As System.Net.WebRequest
Dim request As System.Net.HttpWebRequest
request = DirectCast(System.Net.HttpWebRequest.Create(uri), System.Net.HttpWebRequest)
request.Credentials = MyBase.Credentials
request.CookieContainer = New System.Net.CookieContainer()
If m_authCookie IsNot Nothing Then
request.CookieContainer.Add(m_authCookie)
End If
Return request
End Function ' GetWebRequest
''' <summary>
''' Overriding the method defined in the base class.
''' </summary>
''' <param name="request"></param>
''' <returns></returns>
Protected Overrides Function GetWebResponse(request As System.Net.WebRequest) As System.Net.WebResponse
Dim response As System.Net.WebResponse = MyBase.GetWebResponse(request)
' http://social.msdn.microsoft.com/Forums/sqlserver/en-US/f68c3f2f-c498-4566-8ba4-ffd5070b8f7f/problem-with-ssrs-forms-authentication
Dim cookieName As String = response.Headers("RSAuthenticationHeader")
If cookieName IsNot Nothing Then
m_authCookieName = cookieName
Dim webResponse As System.Net.HttpWebResponse = DirectCast(response, System.Net.HttpWebResponse)
Dim authCookie As System.Net.Cookie = webResponse.Cookies(cookieName)
' Save it for future reference and use.
m_authCookie = authCookie
End If
Return response
End Function ' GetWebResponse
Conseil 4: Les méthodes ci-dessus ne fonctionnera pas si vous havre de paix 't installé le service pack 1 + 2 sur SSRS 2008 R2 ...
Indice 5: Les paramètres Translate ODE est là parce que vous ne pouvez pas (par conception) traduire les invites de paramètre à plusieurs langues par SSRS, vous écrivez donc:
Raum/Local/Locale/Room
qui utilise le schéma:
Text_DE/Text_FR/Text_IT/Text_EN
Et puis ne divisé par «/» sur le texte (qui est une petite erreur sujette si votre texte d'invite contient '/' quelque part), puis sélectionnez le bon texte par index de la langue, en choisissant MIN (splitarray.length, index) btw, juste au cas où vous n'avez que Text_DE/Text_FR ou autre chose, vérifiez d'abord si le texte contient un '/', bien sûr.
Indice 6: Dois-je continuer? (Je pourrais encore étendre cette publication à dix fois la taille, mais je pense que je devrais retourner au travail maintenant :))
Si vous voulez voir à quel point il semble, c'est comment vanille ssrs rend en chrome
C'est ce qu'il ressemble à IE11, avec une compatibilité IE5 réglée via xua
et voici ce qu'il devrait être, et ce que vous pouvez l'obtenir pour rendre avec beaucoup bricoler avec javascript et CSS
Addendum:
Oh, et il y a encore mieux
Si vous voulez exécuter ReportViewer dans une langue spécifiée par votre application (ce qui est identique à la langue du navigateur), vous devez définir la culture de ReportViewer à la culture spécifiée dans votre chaîne de requête ...
<script type="text/C#" runat="server">
protected override void InitializeCulture()
{
string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];
// System.Web.HttpContext.Current.Response.Write(sprache);
switch(System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToLower(sprache))
{
case "fr":
sprache = "fr-CH";
break;
case "it":
sprache = "it-CH";
break;
case "en":
sprache = "en-US";
break;
default:
sprache = "de-CH";
break;
}
// System.Web.HttpContext.Current.Response.Write(sprache);
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
base.InitializeCulture();
}
</script>
Si vous souhaitez définir une culture statique, vous pouvez le faire dans la déclaration de la page
<%@ Page UICulture="de" Culture="de-CH" %>
Et si vous essayez de supprimer le l'icône d'impression et l'atome d'alimentation, de le faire avec des styles, peu importe comment, il ne fonctionne que dans Chrome ...
input[type="image"][title="Drucken"], input[type="image"][title="Print"], input[type="image"][title="Imprimer"], input[type="image"][title="Stampa"]
{
display: none !important;
}
input[type="image"][title="In Datenfeed exportieren"], input[type="image"][title="Exporter vers un flux de données"], input[type="image"][title="Esporta in feed di dati"], input[type="image"][title="Export to Data Feed"]
{
display: none !important;
}
*/
input[type="image"][src$="Microsoft.Reporting.WebForms.Icons.Print.gif"] {
display: none !important;
}
input[type="image"][src$="Microsoft.Reporting.WebForms.Icons.AtomDataFeed.gif"] {
display: none !important;
}
Mais vous pouvez effectivement supprimer au moins l'icône d'impression dans Internet explorer en ajoutant ShowPrintButton="false"
au contrôle ReportViewer:
<RS:ReportViewerHost ID="ReportViewerControl" ShowPrintButton="false" runat="server" />
Une autre idée: SSRS 2012 & 2014 (et peut-être 2008R2), vous pouvez également ajouter votre méthode javaScript de réparation SSRS dans add_pageLoaded de ScriptManager. Comme ceci:
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function() { fixReportingServices('rpt-container'); });
alors vous n'avez pas écouter la page des événements de changement, ce qui accélère les choses, parce que chargé est appelée une seule fois à la fin de chaque mise à jour.
AVERTISSEMENT
Parce que dans Internet, IE ne fait pas défaut à la vue de la compatibilité,
<meta http-equiv="X-UA-Compatible" content="IE=5">
ne vous aidera pas à certaines questions, soit (texte rotate270/texte vertical).
Même dans Internet Explorer, il ne fonctionne correctement que lorsque vous vous trouvez sur l'intranet, car il utilise alors uniquement la "vue de compatibilité". Alors que le méta-tag définit le navigateur dans IE5-Quirksmode, il n'active pas la "compatibilité view", donc ce n'est pas le vrai quirksmode ...
Êtes-vous aveugle? Bordures de table, texte vertical (rotation 270), alignement d'image, champs de texte (tout ce qui n'est pas dans la table), largeur de bordure etc.Vous pouvez prendre 3 versions différentes d'Internet Explorer, et vous obtenez 3 résultats différents. –