提供多单词建议的自定义AutoCompleteExtender

默认情况下,AutoCompleteExtender显示的结果来自于文本框中输入的全部值,这里我的实现,它可以去搜索文本框中多于一个的单词,它们之间用逗号分割(或者别的符号),任何时间输入逗号,将会显示一个新的建议下拉列表。AutoCompleteExtender并不支持这种类型的列表,我们将通过一些修改来实现这些属性。[英文原文来自于CodeProject]

 

主要内容

1.简介

2.继承AutoCompleteProperties

3.继承AutoCompleteExtender

4.实现自定义的AutoCompleteBehavior

5.测试

 

简介

默认情况下,AutoCompleteExtender显示的结果来自于文本框中输入的全部值,这里我的实现,它可以去搜索文本框中多于一个的单词,它们之间用逗号分割(或者别的符号),任何时间输入逗号,将会显示一个新的建议下拉列表。AutoCompleteExtender并不支持这种类型的列表,我们将通过一些修改来实现这些属性。

 

继承AutoCompleteProperties

第一步为新控件CustomAutoCompleteExtender创建C#类,我们将定义一个继承于AutoCompleteProperties的类CustomAutoCompleteProperties,并添加多单词建议支持和CSS样式属性,为了实现多单词建议,我们需要一个属性SeparatorChar,通过该属性,我们可以拆分成一个一个的单词并为最新输入的单词打开建议列表。

namespace CustomAtlas.Controls

{

    
public class CustomAutoCompleteProperties : AutoCompleteProperties

    
{

        
public string SeparatorChar

        
{

            
get

            
{

                
object obj = base.ViewState["SeparatorChar"];

                
if (obj != nullreturn (string)obj;

                
else return ",";

            }


            
set

            
{

                
base.ViewState["SeparatorChar"= value;

                
base.OnChanged(EventArgs.Empty);

            }


        }


 

        
public string CssList

        
{

            
get

            
{

                
object obj = base.ViewState["CssList"];

                
if (obj != nullreturn (string)obj;

                
else return String.Empty;

            }


            
set

            
{

                
base.ViewState["CssList"= value;

                
base.OnChanged(EventArgs.Empty);

            }


        }


 

        
public string CssItem

        
{

            
get

            
{

                
object obj = base.ViewState["CssItem"];

                
if (obj != nullreturn (string)obj;

                
else return String.Empty;

            }


            
set

            
{

                
base.ViewState["CssItem"= value;

                
base.OnChanged(EventArgs.Empty);

            }


        }


 

        
public string CssHoverItem

        
{

            
get

            
{

                
object obj = base.ViewState["CssHoverItem"];

                
if (obj != nullreturn (string)obj;

                
else return String.Empty;

            }


            
set

            
{

                
base.ViewState["CssHoverItem"= value;

                
base.OnChanged(EventArgs.Empty);

            }


        }


    }


}

CssList, CssItemCssHoverItem需要构建控件的样式,CssList提供用来画下拉列表,CssItemCssHoverItem用来画列表中的每一项。

 

继承AutoCompleteExtender

完成了第一步,我们继续实现Extender,在这里我们需要从AutoCompleteExtender继承并为控件添加新的属性。

namespace CustomAtlas.Controls

{

    
public class CustomAutoCompleteExtender : AutoCompleteExtender

    
{

        
protected override void RenderScript(Microsoft.Web.Script.ScriptTextWriter writer, Control targetControl)

        
{

            
// get our CustomAutoCompleteProperties

            CustomAutoCompleteProperties cacp 
= (CustomAutoCompleteProperties) base.GetTargetProperties(targetControl);

 

            
if ((cacp != null&& cacp.Enabled)

            
{

                
// check if the ServicePath is set

                
string _ServicePath = cacp.ServicePath;

                
if (_ServicePath == String.Empty)

                
{

                    _ServicePath 
= this.ServicePath;

                }


                
if (_ServicePath == String.Empty)

                
{

                    
throw new InvalidOperationException("The ServicePath must be set for AutoCompleteBehavior");

                }


 

                
// check if the ServiceMethod is set

                
string _ServiceMethod = cacp.ServiceMethod;

                
if (_ServiceMethod == String.Empty)

                
{

                    _ServiceMethod 
= this.ServiceMethod;

                }


                
if (_ServiceMethod == String.Empty)

                
{

                    
throw new InvalidOperationException("The ServiceMethod must be set for AutoCompleteBehavior");

                }


 

                
// search for the completion list control if an ID was supplied

                Control c 
= null;

                
string drp = this.DropDownPanelID;

                
if (drp != String.Empty)

                
{

                    c 
= this.NamingContainer.FindControl(drp);

                    
if (c == null)

                    
{

                        
throw new InvalidOperationException("The specified DropDownPanelID is not a valid ID");

                    }


                }


 

                
// write the Atlas markup on page

                writer.WriteStartElement(
"autoComplete");

                writer.WriteAttributeString(
"serviceURL"base.ResolveClientUrl(_ServicePath));

                writer.WriteAttributeString(
"serviceMethod", _ServiceMethod);

                
if (c != null) writer.WriteAttributeString("completionList", c.ClientID);

                writer.WriteAttributeString(
"minimumPrefixLength", cacp.MinimumPrefixLength.ToString());

                writer.WriteAttributeString(
"separatorChar", cacp.SeparatorChar);

                writer.WriteAttributeString(
"cssList", cacp.CssList);

                writer.WriteAttributeString(
"cssItem", cacp.CssItem);

                writer.WriteAttributeString(
"cssHoverItem", cacp.CssHoverItem);

                writer.WriteEndElement();

            }


        }


    }


}

 

实现自定义的AutoCompleteBehavior

现在控件已经完成,我们只剩下管理客户端代码以发送正确的值到WebService并提供我们自定义的CSS样式。在Atlas.js中查找到AutoCompleteBehavior,我们可以拷贝到这里并注册我们自己的类。

ype.registerNamespace('Custom.UI');

 

Custom.UI.AutoCompleteBehavior 
= function() {

    Custom.UI.AutoCompleteBehavior.initializeBase(
this);

    

    
var _appURL;

    
var _serviceURL;

    
var _serviceMethod;

    
var _separatorChar = ',';

    
var _minimumPrefixLength = 3;

    
var _cssList;

    
var _cssItem;

    
var _cssHoverItem;

    
var _completionSetCount = 10;

    
var _completionInterval = 1000;

    
var _completionListElement;

    
var _popupBehavior;

    

    
var _timer;

    
var _cache;

    
var _currentPrefix;

    
var _selectIndex;

    

    
var _focusHandler;

    
var _blurHandler;

    
var _keyDownHandler;

    
var _mouseDownHandler;

    
var _mouseUpHandler;

    
var _mouseOverHandler;

    
var _tickHandler;

    

    
this.get_appURL = function() {

        
return _appURL;

    }


    
this.set_appURL = function(value) {

        _appURL 
= value;

    }


 

    
this.get_completionInterval = function() {

        
return _completionInterval;

    }


    
this.set_completionInterval = function(value) {

        _completionInterval 
= value;

    }


    

    
this.get_completionList = function() {

        
return _completionListElement;

    }


    
this.set_completionList = function(value) {

        _completionListElement 
= value;

    }


    

    
this.get_completionSetCount = function() {

        
return _completionSetCount;

    }


    
this.set_completionSetCount = function(value) {

        _completionSetCount 
= value;

    }


    

    
this.get_minimumPrefixLength = function() {

        
return _minimumPrefixLength;

    }


    
this.set_minimumPrefixLength = function(value) {

        _minimumPrefixLength 
= value;

    }


    

    
this.get_separatorChar = function() {

        
return _separatorChar;

    }


    
this.set_separatorChar = function(value) {

        _separatorChar 
= value;

    }


    

    
this.get_serviceMethod = function() {

        
return _serviceMethod;

    }


    
this.set_serviceMethod = function(value) {

        _serviceMethod 
= value;

    }


    

    
this.get_serviceURL = function() {

        
return _serviceURL;

    }


    
this.set_serviceURL = function(value) {

        _serviceURL 
= value;

    }