默认情况下,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 != null) return (string)obj;

else return ",";

}

set


{

base.ViewState["SeparatorChar"] = value;

base.OnChanged(EventArgs.Empty);

}

}


public string CssList


{

get


{

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

if (obj != null) return (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 != null) return (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 != null) return (string)obj;

else return String.Empty;

}

set


{

base.ViewState["CssHoverItem"] = value;

base.OnChanged(EventArgs.Empty);

}

}

}

}
CssList, CssItem和CssHoverItem需要构建控件的样式,CssList提供用来画下拉列表,CssItem和CssHoverItem用来画列表中的每一项。
继承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;

}



![]()