要解決這些問題,首先需要知道怎樣來修改相應的代碼並使之在自己的應用中生效。值得慶幸的是,AjaxControlToolkit系列控件是開源的,所以我們可以根據自己的需要來盡情修改。用VS2005打開AjaxControlToolkit解決方案,打開AutoComplete文件夾中的AutoCompleteBehavior.JS文件,修改並重新編譯後,將生成的AJaxControlToolkit.dll文件更新到自己的項目引用中,即可應用我們優化和增強後的AutoComplete控件了。
那麼,具體需要修改哪些代碼呢?
針對第一個問題,需要在AJaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');這一行之前加上:
if (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
第二個問題,要將document.body.appendChild(this._completionListElement);這一行修改為 element.parentNode.appendChild(this._completionListElement);
第三個問題,需要在_onTimerTick方法中,為if (text.trim().length < this._minimumPrefixLength) 這個判斷增加一個條件,變成:if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) ,這就使得,當用戶的輸入超過10個字符時,就不必向服務端調用讀取匹配值的方法了。
第四個問題,要調整自動完成列表的樣式,可以直接修改initializeCompletionList方法中的以下代碼:
completionListStyle.backgroundColor = this._textBackground;
completionListStyle.color = this._textColor;
completionListStyle.border = 'solid 1px buttonshadow';
completionListStyle.cursor = 'default';
completionListStyle.unselectable = 'unselectable';
completionListStyle.overflow = 'hidden';
,或者刪除這幾行,並添加:element.className = "completionList";然後在頁面上添加樣式類“completionList”的定義即可;
要解決最後一個問題,應該在 { prefixText : this._currentPrefix, count: this._completionSetCount}這一行中增加一個發給服務器的參數,變為:
{ prefixText : this._currentPrefix, count: this._completionSetCount , srcId: this.get_element().getAttribute("srcid") }
從而,服務端的讀取自動完成列表項的方法簽名就可以寫成:string[] GetCompletionList(string prefixText, int count ,string srcId)。這意味著,我們可以為需要應用自動完成功能的文本框預先設置一個用於標識其數據來源的標識字符串,C#代碼如:tb.Attributes.Add("srcid", "xxx"); 然後,在GetCompletionList方法中就可以根據客戶端傳過來的這個參數值來有針對性地讀取數據了。