Os controles da série AjaxControlToolkit lançados com o Asp.net Ajax 1.0 trouxeram muita comodidade aos desenvolvedores, mas muitos deles não parecem ser tão perfeitos quanto imaginávamos. Tenho usado muito o controle AutoComplete recentemente e encontrei várias deficiências ou erros:
1. Em alguns casos ocorrerá o erro “dois componentes com o mesmo id”;
2. É fácil causar o problema de "Não foi possível abrir o site da Internet,..., a operação foi encerrada" no IE;
3. Mesmo que o usuário insira muitos caracteres, mesmo que não haja resultado correspondente, ele ainda chamará o método do servidor para tentar obter o valor correspondente, o que aumenta em vão a carga do servidor;
4. O estilo da lista de preenchimento automático não é muito agradável;
5. A assinatura do método do servidor deve ser: string[] GetCompletionList(string prefixText, int count). Outros dados necessários não podem ser obtidos do cliente. Isso é especialmente fatal quando há vários controles de AutoCompletar em uma página que precisam obter dados de diferentes fontes de dados.
Para resolver esses problemas, primeiro você precisa saber como modificar o código correspondente e torná-lo eficaz em sua própria aplicação. Felizmente, os controles da série AjaxControlToolkit são de código aberto, portanto podemos modificá-los de acordo com nossas necessidades. Abra a solução AjaxControlToolkit com VS2005, abra o arquivo AutoCompleteBehavior.js na pasta AutoComplete, modifique e recompile e atualize o arquivo AjaxControlToolkit.dll gerado para sua própria referência de projeto para aplicar nosso controle AutoComplete otimizado e aprimorado.
Então, qual código específico precisa ser modificado?
Para a primeira pergunta, você precisa adicionar antes da linha AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');:
if (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
A segunda questão é alterar a linha document.body.appendChild(this._completionListElement); para element.parentNode.appendChild(this._completionListElement)
; ) Este julgamento adiciona uma condição e se torna: if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) , o que faz com que, quando a entrada do usuário exceder 10 caracteres, não haja precisa chamar o servidor para ler o valor correspondente.
A quarta questão, para ajustar o estilo da lista de preenchimento automático, você pode modificar diretamente o seguinte código no método inicializeCompletionList:
conclusãoListStyle.backgroundColor = this._textBackground;
conclusãoListStyle.color = this._textColor;
conclusãoListStyle.border = 'botão sombra sólida de 1px';
conclusãoListStyle.cursor = 'padrão';
conclusãoListStyle.unselectable = 'não selecionável';
completeListStyle.overflow = 'hidden';
ou exclua essas linhas e adicione: element.className = "completionList" Em seguida, adicione a definição da classe de estilo "completionList" na página
para resolver o último problema
;prefixText: this._currentPrefix, count: this._completionSetCount} Adicione um parâmetro enviado ao servidor nesta linha, que se torna:
{prefixText: this._currentPrefix, contagem: this._completionSetCount, srcId: this.get_element().getAttribute("srcid") }
Portanto, a assinatura do método do lado do servidor para leitura de itens da lista de preenchimento automático pode ser escrita como: string[] GetCompletionList(string prefixText, int count, string srcId). Isso significa que podemos pré-definir uma string de identificação para identificar sua fonte de dados para a caixa de texto que precisa aplicar a função de preenchimento automático. O código C# é como: tb.Attributes.Add("srcid", "xxx" ); Então, no método GetCompletionList, os dados podem ser lidos de maneira direcionada com base no valor do parâmetro passado pelo cliente.