AJAX :: MaskedEdit Extender im Jahr 2000

asp.NET Kein Kommentar »

Wer den MaskedEdit Externder aus dem AJAX-Toolkit (http://www.asp.net/ajax) einsetzt, kenn die Problematik, dass ein Datumswert, der nicht im Format dd.mm.yyyy eingegeben wird sondern als dd.mm.yy, zurück ins 20. Jahrhundert (also 19xx) zurückkatapultiert wird…
Auch die Eigenschaft Century nutzt hier nichts, denn diese wird schlicht und ergreifend ignoriert.

Eine kleine Änderung im MaskedEditBehavior.js lehrt den MaskedEdit Extender das 21. Jahrhundert:

Zeile 2005 – Funktion: _GetDateElementText

if (Y4)
  {
  if (aux !=”" && aux.length < 4)
    {
     while (aux.length < 4)
     {
       aux = “0″ + aux;
      }

     // DIESE ZEILE EINFÜGEN –>
     if (aux.substring(0,2) == ‘00′) aux = ‘2′+aux.substring(1,4);
     // <–

     m_arrDate[this.get_CultureDateFormat().indexOf("Y")] = aux;
   }
}
else [...]

Jetzt springt der MaskedEditExtender automatisch auf 20xx um…

C# :: SQL ReportServer in asp.NET

C#, asp.NET Kein Kommentar »

Voraussetzung für die Umsetzung dieses Beitrags ist ein funktionierender Report auf Basis des SQL Reporting Services. Hierbei ist es unerheblich mit welcher SQL Server Version (2005[8.0] oder 2008[9.0]) gearbeitet wird. Die asp.NET-Umsetzung habe ich im Framework 2.0 umgesetzt.

Zunächst brauchen wir eine (in meinem Fall serialisierbare) Klasse, die das Interface Microsoft.Reporting.Webforms.IReportsServerCrendentials zur Ausführung des Reports implementiert:

[Serializable]
public class ReportCredentials :
      Microsoft.Reporting.WebForms.IReportServerCredentials
{
   string _userName, _password, _domain;

   public ReportCredentials(string userName, string password,
            string domain)
   {
      _userName = userName;
      _password = password;
      _domain = domain;
   }

   public System.Security.Principal.WindowsIdentity  ImpersonationUser
   {
      get
      {
          return null;
       }
    }

   public System.Net.ICredentials NetworkCredentials
   {
     get
     {
        return new System.Net.NetworkCredential
                       (_userName, _password, _domain);
     }
   }

   public bool GetFormsCredentials(out System.Net.Cookie authCookie,
             out string userName, out string password,
             out string authority)
   {
      userName = _userName;
      password = _password;
      authority = _domain;
      authCookie = new System.Net.Cookie
                      (“.ASPXAUTH”, “.ASPXAUTH”, “/”, “Domain”);
      return true;
     }
}

 Auf der aspx-Page, auf der der Report eingebunden werden soll, muss ein Steuerelement “ReportViewer” und folgender Code eingefügt werden:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    ReportViewer1.ShowCredentialPrompts = false;
    ReportViewer1.ServerReport.ReportServerCredentials =
             new ReportCredentials(“UserName”, “Passwort”, “”);
    ReportViewer1.ProcessingMode = 
             Microsoft.Reporting.WebForms.ProcessingMode.Remote;
    ReportViewer1.ServerReport.ReportServerUrl =
             new System.Uri(“http://reportserver/ReportServer”);
    ReportViewer1.ServerReport.ReportPath =
             “/Path2Report/ReportName”;

    ReportViewer1.ServerReport.Refresh();
  }
}

Auch eine Parametrisierung aus der Webpage ist möglich:

ReportParameter[] param = new ReportParameter[1];
param[0] = new ReportParameter(“ReportParam”, txtParameter.Text);

ReportViewer1.ServerReport.SetParameters(param);

 

Und zu guter letzt muss noch ein Abschnitt in der web.config im Abschnitt <system.web><httpHandlers>  angelegt werden:

<add verb=”*” path=”Reserved.ReportViewerWebControl.axd” type = “Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

JS/asp.NET :: Modales Popup

Schlagwörter:, , , , asp.NET, html/js Kein Kommentar »

Nachdem ich ja bereits das “puristische” modale Popup beschrieben habe, hier nun die elegantere Lösung.

Zunächst benötigen wir ein einfaches Javascript, dass wir im Head-Bereich der aufrufenden Seite platzieren:

<script type=“text/javascript“>
function Dialog()
   {
      var ret=window.showModalDialog(“popup.aspx”,window, ↙
      “dialogHeight: 500px; dialogWidth: 800px; status: No; center:yes”
   );

   if (ret == “1″)
      {
         document.location.href = document.URL;
      }
   }
</script>

Der Aufruf dieses modalen Popups kann über zwei Wege erfolgen:

- per Link im html-Quelltext:

<a href=”javascript:void(0);” onClick=”Dialog();”>Popup öffnen</a>

- per Aufruf durch einen <asp:Button>:

Um den Aufruf durch einen <aps:Button> zu realisieren muss dem Button ein Attribut zugewiesen werden:

protected void Page_Load(object sender, EventArgs e)
{
    myButton.Attributes.Add(“onClick”, “javascript:Dialog();”);
}

Dieses Attribut bewirkt nun, dass beim Klicken des Buttons das Javasript Dialog() aufgerufen werden.

Hinweis:
In der aufgerufenen Seite (also im Popup) sollte im Head folgender Tag platziert werden:

<base target=“_self”/>

Wenn der Tag fehlt, öffnet jeder Link und jeder Klick auf einen Button ein neues Browserfenster ausserhalb unseres modulen Popups.

AJAX :: ListSearchExtender und große Listen

asp.NET Kein Kommentar »

Wer das AJAX-Control-Toolkit von www.asp.net heruntergeladen hat und den ListSearchExtender einsetzt, wird feststellen, dass die Verarbeitung von großen Listen (> 10.000 Einträge in der Liste) ein paar Probleme aufwirft:

  • IsSorted = true führt dazu, dass die Performance so in den Keller geht, dass der Externder nicht mehr wirklich Sinn macht. Da ist die klassische Javascript-Suche schneller…
  • Wenn man also IsSorted = false einstellt und damit eine sehr perfomante Suche gestalten kann, unterdrückt der Extender bei Culture de-DE sämtliche Sonder- und Leerzeichen. Damit ist eine vernünftige Suche weiterhin nicht realisierbar.

Um diese Probleme in den Griff zu bekommen, ist es nun nötig, den ListSearchExternder im SourceCode, der von Microsoft mit dem Toolkit ausgeliefert wird, wie folgt zu verändern:

  1. Starten der AjaxControlToolkit.sln aus dem Root des entpackten ControlKits.
  2. Im Projekt “AjaxControlToolkit” (sollte als erstes aufgeführt sein) die Datei “ListSearch\ListSearchBehavior.js” öffnen
  3. Ersetzen (1):

_checkIfSorted : function(options) {
   if (this._isSorted) {
   // we assume this is sorted
      return true;
   } else {
      // it is not known if elements list is sorted, so check it by itself
      var previousOptionValue = null;
      var optionsLength = options.length;
      for(var index = 0; index < optionsLength; index++) {
         var optionValue = options[index].text.toLowerCase();
         if(previousOptionValue && this._compareStrings 
                   (optionValue, previousOptionValue) < 0) {
            return false;
         }
      previousOptionValue = optionValue;
      }
      return true;
     }
  },

durch

_checkIfSorted : function(options) {
   if (this._isSorted) {
   // we assume this is sorted
      return true;
   } else {
      // it is not known if elements list is sorted, so check it by itself
            return false
      }
  },

 

    4. Ersetzen (2)

_doLinearSearch : function(options, value, left, right) {
   if (this._queryPattern ==
               AjaxControlToolkit.ListSearchQueryPattern.Contains) {
      for(var i = left; i <= right; i++) {
         if(options[i].text.toLowerCase().indexOf(value) >= 0) {
            return i;
            }
        }
    } else if (this._queryPattern ==
               AjaxControlToolkit.ListSearchQueryPattern.StartsWith) {
      for(var i = left; i <= right; i++) {
         if(options[i].text.toLowerCase().startsWith(value)) {
            return i;
         }
      }
    }
      return -1;
    },

durch:

_doLinearSearch : function(options, value, left, right) {
   if (this._queryPattern ==
               AjaxControlToolkit.ListSearchQueryPattern.Contains) {
      for(var i = left; i <= right; i++) {
         if(options[i].text.toLowerCase().indexOf(value) >= 0) {
            return i;
            }
        }
    } else if (this._queryPattern ==
               AjaxControlToolkit.ListSearchQueryPattern.StartsWith) {
      for (var i = left; i <= right; i++) {
         if (options[i].text.toUpperCase().indexOf(
                                value.toUpperCase()) == 0) {
            return i;
            }
         }
      }
      return -1;
      },

 

Kompilieren - die AjaxControlToolkit.dll im Bin-Verzeichnis der Webseite aktualisieren und schon funktioniert es bestens…


11596 | 20081029