AJAX :: ListSearchExtender und große Listen
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:
- Starten der AjaxControlToolkit.sln aus dem Root des entpackten ControlKits.
- Im Projekt “AjaxControlToolkit” (sollte als erstes aufgeführt sein) die Datei “ListSearch\ListSearchBehavior.js” öffnen
- 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…
mherbert