Los controles de la serie AjaxControlToolkit lanzados con Asp.net Ajax 1.0 han brindado mucha comodidad a los desarrolladores, pero muchos de ellos no parecen ser tan perfectos como imaginamos. He estado usando mucho el control Autocompletar recientemente y encontré varias deficiencias o errores:
1. En algunos casos, se producirá el error "dos componentes con la misma identificación";
2. Es fácil causar el problema de "No se puede abrir el sitio de Internet..., la operación ha finalizado" en IE;
3. Incluso si el usuario ingresa muchos caracteres, incluso si no hay un resultado coincidente, aún llamará al método del servidor para intentar obtener el valor coincidente, lo que aumenta en vano la carga sobre el servidor;
4. El estilo de la lista de autocompletar no es muy agradable;
5. La firma del método del servidor debe ser: string [] GetCompletionList (string prefixText, int count) No se pueden obtener otros datos requeridos del cliente. Esto es especialmente grave cuando hay varios controles de Autocompletar en una página que necesitan obtener datos de diferentes fuentes de datos.
Para solucionar estos problemas, primero necesitas saber cómo modificar el código correspondiente y hacerlo efectivo en tu propia aplicación. Afortunadamente, los controles de la serie AjaxControlToolkit son de código abierto, por lo que podemos modificarlos según nuestras propias necesidades. Abra la solución AjaxControlToolkit con VS2005, abra el archivo AutoCompleteBehavior.js en la carpeta AutoComplete, modifique y vuelva a compilar, y actualice el archivo AjaxControlToolkit.dll generado a su propia referencia de proyecto para aplicar nuestro control AutoComplete optimizado y mejorado.
Entonces, ¿qué código específico se debe modificar?
Para la primera pregunta, debe agregar antes de la línea AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');:
si (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = nulo;
}
La segunda pregunta es cambiar la línea document.body.appendChild(this._completionListElement); a element.parentNode.appendChild(this._completionListElement);
la tercera pregunta es usar if (text. trim().length < this._minimumPrefixLength); ) Este juicio agrega una condición y se convierte en: if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10), lo que hace que cuando la entrada del usuario supere los 10 caracteres, no hay Es necesario llamar al servidor para leer el valor coincidente.
La cuarta pregunta, para ajustar el estilo de la lista de autocompletar, puede modificar directamente el siguiente código en el método inicializeCompletionList:
completeListStyle.backgroundColor = this._textBackground;
completeListStyle.color = this._textColor;
completeListStyle.border = 'sombra de botón sólida de 1px';
completeListStyle.cursor = 'predeterminado';
completeListStyle.unselectable = 'no seleccionable';
completeListStyle.overflow = 'hidden';
o elimine estas líneas y agregue: element.className = "completionList"; luego agregue la definición de la clase de estilo "completionList" en la página
para resolver el último problema
;prefixText: this._currentPrefix, count: this._completionSetCount} Agregue un parámetro enviado al servidor en esta línea, que se convierte en:
{ prefixText: this._currentPrefix, recuento: this._completionSetCount, srcId: this.get_element().getAttribute("srcid") }
Por lo tanto, la firma del método del lado del servidor para leer elementos de la lista de autocompletar se puede escribir como: string[] GetCompletionList(string prefixText, int count, string srcId). Esto significa que podemos preestablecer una cadena de identificación para identificar su fuente de datos para el cuadro de texto que necesita aplicar la función de autocompletar. El código C# es como: tb.Attributes.Add("srcid", "xxx" ); Luego, en el método GetCompletionList, los datos se pueden leer de manera específica según el valor del parámetro pasado por el cliente.